Spring Boot 2.x实战82 - Spring Security 6 - 一个完整的Spring Security实战演示(基于用户、角色、权限)

SpringSecurity-6.微服务权限案例 微服务权限管理案例主要功能: 1.登录(认证) 2.添加角色 3.为角色分配菜单权限 4.添加用户 5.位用户分配角色 *-------------------------------------------------------------------------------------------------------------- 1.表的设计 添加角色->为角色分配菜单 添加用户->为用户分配角色 2.在数据库中创建表 见附件1。 3.案例涉及技术说明 maven 创建父工程 阅读详情

2 Spring Security实战

在这一节我们讲演示一个基于用户、角色、权限的更为实用的例子;一个用户有一个或多个角色,每个角色有一个或多个的权限。

新建应用,信息如下:

Group:top.wisely

Artifact:learning-spring-security-in-battle

Dependencies:Spring Security、Spring Web Starter、Spring Data JPA、MySQL Driver、Lombok

build.gradle文件中的依赖如下:

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
   implementation 'org.springframework.boot:spring-boot-starter-security'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   compileOnly 'org.projectlombok:lombok'
   runtimeOnly 'mysql:mysql-connector-java'
   annotationProcessor 'org.projectlombok:lombok'
   //...
}

删除上一个应用的数据库SYS_USER表,在application.yml中连接数据库:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/first_db?useSSL=false
    username: root
    password: zzzzzz
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update

用户、角色、权限的实体分别是SysUser、SysRole、SysAuthority:

我们也看权限的实体:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class SysAuthority {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name; //权限名称

    private String value; //权限值

    public SysAuthority(String name, String value) {
        this.name = name;
        this.value = value;
    }
}

角色的实体:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class SysRole {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToMany(targetEntity = SysAuthority.class)
    private Set<SysAuthority> authorities; // 角色和权限是多对多的关系

    public SysRole(String name, Set<SysAuthority> authorities) {
        this.name = name;
        this.authorities = authorities;
    }
}

用户的实体:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class SysUser implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true)
    @NotNull
    private String username;

    private String password;

    private String realName;

    private Boolean enable;

    @ManyToMany(targetEntity = SysRole.class, fetch = FetchType.EAGER)
    private Set<SysRole> roles; //用户和角色是多对多的关系

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Collection<GrantedAuthority> authorities = new HashSet<>();
        roles.forEach(role -> {
            role.getAuthorities().forEach(authority -> {
                authorities.add(new SimpleGrantedAuthority(authority.getValue()));
            });
        });
        return authorities; //获取当前用户的角色集合,通过角色集合获得当前用户的权限集合。
    }

    public SysUser(String username, String password, String realName, Boolean enable, Set<SysRole> roles) {
        this.username = username;
        this.password = password;
        this.realName = realName;
        this.enable = enable;
        this.roles = roles;
    }
	// 省略其它接口方法
}

三个Repository分别为:

public interface SysUserRepository extends JpaRepository<SysUser, Long> {
    Optional<SysUser> findByUsername(String username);
}
public interface SysRoleRepository extends JpaRepository<SysRole, Long> {
}
public interface SysAuthorityRepository extends JpaRepository<SysAuthority, Long> {
}

安全的配置:

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .httpBasic().authenticationEntryPoint(authenticationEntryPoint());
    }

    @Bean
    AuthenticationEntryPoint authenticationEntryPoint(){
        BasicAuthenticationEntryPoint authenticationEntryPoint = new BasicAuthenticationEntryPoint();
        authenticationEntryPoint.setRealmName("wisely");
        return authenticationEntryPoint;
    }

    @Bean
    UserDetailsService userDetailsService(SysUserRepository sysUserRepository){
        return new CusotmUserDetailsService(sysUserRepository); //源码和上节相同
    }

    @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

演示权限的控制器方法:

    @GetMapping("/userCan1")
    @PreAuthorize("hasAuthority('userCan1')") //当前用户拥有的Authorities是否包含userCan1
    public Map<String, Object> userCan1(@AuthenticationPrincipal SysUser sysUser){
        return getReturnMap(sysUser,"userCan1");
    }

    @GetMapping("/userCan2")
    @PreAuthorize("hasAuthority('userCan2')")//当前用户拥有的Authorities是否包含userCan2
    public Map<String, Object> userCan2(@AuthenticationPrincipal SysUser sysUser){
        return getReturnMap(sysUser,"userCan2");

    }

    @GetMapping("/adminCan1")
    @PreAuthorize("hasAuthority('adminCan1')")//当前用户拥有的Authorities是否包含adminCan1
    public Map<String, Object> adminCan1(@AuthenticationPrincipal SysUser sysUser){
        return getReturnMap(sysUser,"adminCan1");
    }

    @GetMapping("/adminCan2")
    @PreAuthorize("hasAuthority('adminCan2')")//当前用户拥有的Authorities是否包含adminCan2
    public Map<String, Object> adminCan2(@AuthenticationPrincipal SysUser sysUser){
        return getReturnMap(sysUser,"adminCan2");
    }

    private Map<String, Object> getReturnMap(SysUser sysUser, String currentAuthority) {
        Map<String, Object> map = new HashMap<>();
        map.put("user-authorities" , sysUser.getAuthorities()); //
        map.put("current-authority", "userCan1");
        return map;
    }
    
}

我们通过CommandLineRunner初始化系统的所有权限、角色和用户,第二次运行系统的时候要记得注释掉这些代码:

@SpringBootApplication
public class LearningSpringSecurityInBattleApplication {

   public static void main(String[] args) {
      SpringApplication.run(LearningSpringSecurityInBattleApplication.class, args);
   }

   @Bean
   CommandLineRunner init(SysUserRepository sysUserRepository,
                     SysRoleRepository sysRoleRepository,
                     SysAuthorityRepository sysAuthorityRepository,
                     PasswordEncoder passwordEncoder){
      return args -> {
         SysAuthority authority1 = sysAuthorityRepository.save(new SysAuthority("userCan1","userCan1"));
         SysAuthority authority2 = sysAuthorityRepository.save(new SysAuthority("userCan2","userCan2"));
         SysAuthority authority3 = sysAuthorityRepository.save(new SysAuthority("adminCan1","adminCan1"));
         SysAuthority authority4 = sysAuthorityRepository.save(new SysAuthority("adminCan2","adminCan2"));

         SysRole role1 = sysRoleRepository.save(new SysRole("普通用户",
               Stream.of(authority1,authority2).collect(Collectors.toSet())));
         SysRole role2 = sysRoleRepository.save(new SysRole("管理员",
               Stream.of(authority1,authority2,authority3,authority4).collect(Collectors.toSet())));

         SysUser user1 = sysUserRepository.save(new SysUser("wyf",
               passwordEncoder.encode("111111"),
               "wangyunfei",
               true,
               Stream.of(role1).collect(Collectors.toSet())));

         SysUser user2 = sysUserRepository.save(new SysUser("admin",
               passwordEncoder.encode("admin"),
               "administrator",
               true,
               Stream.of(role2).collect(Collectors.toSet())));

      };
   }

}

普通用户角色的用户wyf,可以访问userCan1、userCan2;管理员角色的用户admin,可访问userCan1、userCan2、adminCan1、adminCan2。

访问http://localhost:8080/userCan1,两个用户均能访问。
在这里插入图片描述
访问http://localhost:8080/adminCan1,只有管理员角色用户才能访问,管理员角色包含adminCan1权限。
在这里插入图片描述

新书推荐:

我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html
在这里插入图片描述

主要包含目录有:

第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和批处理(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。

GeoServer 2.25.x 新选择:AuthKey插件鉴权全攻略,告别明文传账号密码 本文详细介绍了GeoServer 2.25.x中AuthKey插件的安全鉴权实践,帮助管理员告别明文传输账号密码的风险。通过实战部署、企业级架构设计和客户端集成,提升GIS服务的访问权限控制,确保数据传输安全。 阅读详情

相关推荐

SpringBoot整合Shiro实现安全认证与权限控制

在Java企业级开发中,安全认证是系统架构的核心组件。Apache Shiro作为轻量级安全框架,通过Subject、SecurityManager和Realm三大核心组件,提供了简洁而强大的认证授权解决方案。相比Spring Security的复杂配置,Shiro以其'简单至上'的设计哲学显著降低了学习曲线。技术实现上,Shiro支持基于角色的访问控制(RBAC)和权限字符串的细粒度控制,通过哈希加密算法保障密码安全,并可与Redis等缓存技术集成提升性能。典型应用场景包括电商系统的用户权限管理、金融平台

weixin_30527423的博客 422

Springboot 3 + Spring Security 6 + OAuth2 入门级最佳实践

当我的项目基于 SpringBoot 3 而我想使用Spring Security,最终不幸得到WebSecurityConfigurerAdapter被废弃的消息。本文档就是在这样的情况下产生的。

m0_64469199的博客 2万+

基于Python和CNN的中药材图像识别系统设计与实现

卷积神经网络(CNN)作为深度学习的重要分支,通过局部连接和权值共享显著提升了图像特征提取能力。在计算机视觉领域,CNN因其出色的特征学习能力被广泛应用于图像分类任务。中药材识别作为传统医药学与现代技术的结合点,面临着人工鉴别效率低、主观性强等痛点。本项目采用VGG16网络结构,结合数据增强技术,构建了准确率达91%的中药材分类模型。系统采用B/S架构,前端使用Vue.js+Element UI,后端基于Spring Boot,通过Flask实现Python与Java的跨语言调用,为中医药信息化提供了可落地

452

springboot 获取登录浏览器_SpringBoot2系列教程88-SpringBoot整合SpringSecurity实现认证拦截...

SpringBoot2.x系列教程88--SpringBoot整合SpringSecurity实现认证拦截作者:一一哥一. SpringSecurity简介1. SpringSecurity概述Spring Security 是 Spring 社区的一个顶级项目,也是 Spring Boot 官方推荐使用的安全框架。除了常规的认证(Authentication)和授权(Authorization)...

weixin_39754915的博客 426

Gemini 3.0如何重构软件开发流程与工程师角色

软件开发正从‘手写代码’迈向‘目标驱动的智能体协作’新范式。其核心在于AI对百万级代码上下文的语义连贯理解、多模态需求到可运行原型的零损耗转化,以及基于约束的自主任务规划能力。这种演进不仅提升编码、测试、部署等环节效率数十倍,更推动开发流程从线性执行转向闭环认知——开发者角色由执行者升维为需求定义者、Agent训练师与系统牧羊人。Gemini 3.0并非工具升级,而是对‘开发’本质的重定义:当AI能理解架构意图、生成合规代码并验证业务逻辑时,人类的核心价值锚定在真实场景洞察、跨域需求整合与技术战略决策上。

aiman5818的博客 417

实验室预约小程序开发实战:数据库设计与并发冲突处理

预约系统本质上是一个资源调度器,核心挑战在于如何高效管理有限资源并保证数据一致性。在诸如实验室、会议室、工位等场景中,预约业务通常涉及多角色审批流程和复杂的时间段冲突检测。开发者需要从数据库设计入手,合理拆分业务表结构,并利用唯一索引、分布式锁等手段应对并发预约下的“超卖”问题。随着移动端普及,基于微信小程序搭建预约入口已成为主流,配合Spring Boot等后端框架,可实现从用户认证、权限控制到预约状态流转的完整闭环。本文以实验室预约小程序为例,深入剖析基础实验室与专业实验室的差异化模型设计、冲突检测算法

weixin_30740581的博客 396

Spring Security 6 配置方法,废弃 WebSecurityConfigurerAdapter

在Spring Security 5.7.0-M2中,Spring就废弃了WebSecurityConfigurerAdapter,因为Spring官方鼓励用户转向基于组件的安全配置。本文整理了一下新的配置方法。在下面的例子中,我们使用Spring Security lambda DSL和HttpSecurity#authorizeHttpRequests方法来定义我们的授权规则,从而遵循最佳实践。

markvivv随笔 2万+

STC8G1K08A 实战应用:从配置到功能实现

本文详细介绍了STC8G1K08A单片机的实战应用,从开发环境搭建、GPIO配置、ADC模块使用到定时器中断处理和PWM输出等核心功能。重点讲解了外设模块的协同工作配置技巧,并分享了实际项目开发中的经验教训,帮助开发者快速掌握STC8G1K08A的高效应用。

n4o5p6q7r的博客 390

SpringBoot2.6 + SpringSecurity 分离版

SpringBoot2.6+SpringSecurity(前后端分离版)

普通人一枚 4037

2D激光slam数据集的下载与测试

参考博客: https://blog.csdn.net/qq_24894159/article/details/81265991 https://blog.csdn.net/fk1174/article/details/52673413#commentBox 数据集下载与生成 下载数据集 下载网址: http://ais.informatik.uni-freiburg.de/slamevaluation/datasets.php 进去网站后点你想下载的对应的"download log file" 然后你

老李的博客 4025

set_data_check专题[使用,report_timing,setup/hold检查]

set_data_check用于约束『数据-对-数据』的『建立保持』时间检查,通常被称为非时序约束 ( non-sequential constraints ), 理论上set_data_check 可以设在任意的两个data pin 上,其中一个pin 称为 constrained pin 类似于寄存器的data pin, 另一个pin 称为related pin 类似于寄存器的clock pin.

cy413026的博客 1万+

Spring Security学习路径(含认证、授权、OAuth2.0与Reactive Spring Security)

基础 Spring Boot 2.x实战77 - Spring Security 1 - Spring Boot下的Spring Security(自动配置)与Web安全配置 Spring Boot 2.x实战78 - Spring Security 2 - Spring Security的认证(Authentication) Spring Boot 2.x实战79 - Spring Security 3 - Spring Security的授权(Authorization)之Web路径安全 Spring

汪云飞记录本 2929

vivado实现SDI接口

XAPP1249,用来介绍UHD_SDI的实现。

Huskar_Liu的博客 7076

基于Spring Boot的实习管理系统设计与实现

实习管理系统是高校信息化建设中的重要组成部分,通过数字化手段解决传统实习管理中的信息孤岛问题。系统采用Spring Boot+Vue.js的前后端分离架构,结合MySQL数据库和Redis缓存,实现了实习全流程的在线化管理。在技术实现上,运用状态机模式管理实习生命周期,通过定时任务自动触发业务提醒,并采用分布式锁解决缓存击穿问题。这类系统典型应用于高校教学管理场景,能有效提升实习岗位匹配效率、加强过程监控、规范评价体系。项目中MyBatis-Plus和Element UI等技术栈的选择,特别考虑了高校现有技

weixin_33796177的博客 302

别再买模块了!手把手教你用FT232RL-REEL芯片,从零设计一个USB转串口电路板

本文详细介绍了如何使用FT232RL-REEL芯片从零设计USB转串口电路板,涵盖核心器件选型、原理图设计、PCB布局布线及焊接调试等关键步骤。通过实战案例和性能对比,展示自制电路板在成本、性能和可靠性上的优势,特别适合硬件爱好者和工程师参考。

weixin_30561425的博客 431

51单片机 驱动有源/无源蜂鸣器+Proteus仿真

51单片机 驱动有源/无源蜂鸣器+Proteus仿真 相关篇《51单片机 Proteus仿真有源蜂鸣器始终不响原因及解决方法》 电路搭建 采用NPN管驱动有源蜂鸣器电路 采用PNP管驱动有源蜂鸣器电路 采用PNP管驱动无源蜂鸣器 采用NPN管驱动无源蜂鸣器 Proteus元器件列表 实例代码 /************************************************************************************* * 实验现象:下载程序

perseverance51博客 2万+

基于YOLOv8/v10/v11/v12/26的森林野外火灾火焰烟雾检测系统(Spring Boot+Vue+Flask+DeepSeek+千问大模型)完整实现与模型对比分析

基于YOLOv8/v10/v11/v12/26的森林野外火灾火焰烟雾检测系统(Spring Boot+Vue+Flask+DeepSeek+千问大模型)完整实现与模型对比分析

斌擎科技 480

学Simulink--人形机器人控制场景实例:基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真

matlab编辑% 连杆长度 (m)% 躯干(髋到CoM)% 大腿% 小腿% 质量 (kg)% 转动惯量(绕质心,简化为杆)matlab编辑% 躯干CoM(假设在髋上方L_body/2处)% 左大腿CoM% 左小腿CoM% (右腿类似,略)本文完成了基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真,实现了:✅ 定义7-DOF平面人形结构✅ 使用Symbolic Math Toolbox自动推导动力学方程✅ 生成。

amy_mhd的博客 397

【课程设计】基于Vue的驾校车辆管理系统 计算机毕业设计源码16480

本系统的总体功能设计包括普通用户、教练用户和管理员三个角色的管理需求,旨在实现基于vue的汽车驾校车辆管理系统的高效管理与资源优化配置。对于普通用户,系统提供登录注册、首页、交流论坛、活动公告、驾校资讯、留言反馈、驾校信息、我的账户、个人中心(报名信息、教练安排、收藏、评论管理)等功能。教练用户端则包括登录、教练安排管理、车辆信息管理、安全事件管理、维修保养管理、维修进度管理等功能。维修工用户则包括登录、维修保养管理、维修进度管理、配件仓库管理、配件出库管理、维修采购管理。管理员则具备更为全面的管理功能..

高级程序源的博客 655

基于 STM32 的全自动洗车监控系统设计与实现

本文提出一种基于 STM32F103RCT6 芯片的全自动洗车监控系统方案,通过多传感器融合与智能控制算法,实现车辆检测、洗车流程自动化及状态远程监控。系统集成硬件选型、电路设计、软件流程及通信功能,可广泛应用于智能洗车场景。

weixin_42300449的博客 964

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【课程设计】火锅外卖系统 计算机毕业设计源码 计算机毕业设计源码88126

系统采用前后端分离架构,后端基于Spring Boot,利用MyBatis实现数据持久化,并集成Redis缓存机制以提升高并发场景下的响应性能;前端通过微信小程序实现用户交互,店铺信息、菜品信息、美食资讯、网站公告列表、订单信息及评价等功能。针对火锅外卖的特点,系统创新性地设计了保温配送管理模块,并引入第三方物流接口实现订单状态实时同步[⑤]....

Biye_Design的博客 1296

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【课程设计】springboot景区摊位租赁管理系统-计算机毕业设计源码68075

系统实现了普通用户与管理员两类角色的功能需求。对于普通用户,提供了包括首页浏览、讨论社区参与、摊位查询及申请等功能;管理员则可以进行用户管理、摊位信息发布、申请审核、缴费管理等操作。通过集成多种功能模块,如用户管理、景区摊位管理、监察举报管理等,利用Spring Boot框架的强大功能实现系统的快速搭建与部署,结合MySQL数据库确保数据的安全性和稳定性。

Biye_Design的博客 1387

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Kimi K2.5、GLM 5、M2.7编程模型选型指南:按工程卡点匹配技术底座

大模型在代码生成场景中并非单纯比拼参数量或基准分数,而是围绕长上下文理解、中文工程语义对齐、确定性工具调用三大核心技术维度构建差异化能力。其底层原理分别涉及AST感知分块与动态NTK插值、本地化API映射与中文commit message指令微调、JSON-RPC签名式函数调用与编译器级根因分析。这些能力直接决定模型在金融系统重构、国产中间件适配、等保三级审计等高要求生产环境中的可用性与可维护性。本文聚焦真实研发卡点——如跨文件符号解析失效、方言SQL迁移错误、审计日志不可追溯等典型故障,结合压测数据与上线

dianning8393的博客 421

技术项目命名规范与个性化实践:从变量到项目的艺术

命名规范是软件开发中的基础概念,它通过统一的规则体系确保代码的可读性和可维护性。其核心原理在于建立标识符与功能的映射关系,使代码具备自文档化能力。在技术价值层面,良好的命名规范能显著提升团队协作效率和系统可扩展性。应用场景涵盖变量命名、函数设计、数据库表结构定义等各个环节。本文以个性化命名实践为例,结合Spring Boot和MySQL技术栈,探讨如何在保持技术规范的前提下融入创意元素,实现命名规范与个性化表达的平衡。

weixin_30595035的博客 328

【课程设计】(附源码)springboot自习室座位预约系统 毕业设计674156

在社会快速发展的影响下,教育事业蓬勃发展,大大增加了学校的数量、多样性、教育质量等要求,使教育的管理和运营比过去更加困难。依照这一现实为基础,设计一个快捷而又方便的自习室座位预约系统是一项十分重要并且有价值的事情。对于传统的自习室座位预约系统来说,自习室座位预约系统具有许多不可比拟的优势,首先是快速更新校园资讯,其次是大量信息的管理,最后是高度安全,以及使用简单等特性,这使得自习室座位预约系统的管理和运营非常方便。进入21世纪,因为科技和经济的迅速发展,人民普遍对非物质层面的精神需求变得越来越多元化。

Biye_Design的博客 3061
上一篇: Spring Boot 2.x实战81 - Spring Security 5 - Spring Security与Spring Data的集成
下一篇: Spring Boot 2.x实战83 - Spring Security 7 -OAuth 2.0之Authorization Server(基于JWT)
汪云飞记录本
博客等级 码龄20年 123粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值