当前位置: 首页 > java >正文

SpringSecurity配置(权限认证)

文末有本篇文章的项目源码可供下载学习

0.配置思路

  1. 在本项目案例的基础上进行相关的配置。
  2. 在数据库中建立权限表/角色表/角色-权限表,并在用户表中加入role_id属性,与角色表进行关联
  3. 生成相应的pojo层/mapper层文件
  4. 修改UserDetailsServiceImpl.java中的loadUserByUsername方法,获取登录用户所对应的权限信息,并将权限信息放入到UserDetailsImpl中.
  5. 在需要权限验证的Controller方法中,利用@PreAuthorize注解,标注好对应的权限信息.
  6. 在SecurityConfig.java文件中开启注解支持.@EnableGlobalMethodSecurity(prePostEnabled = true)
  7. 进行相关测试.

1.数据库表操作

1.1权限表

1.2角色表

1.3角色-权限表

1.4修改用户表,将role_id属性加入到用户表中 

2. 新建pojo层/mapper层文件

/*** @TableName perm*/
@Data
public class Perm {private String id;private String name;private String permStr;
}
/*** @TableName role*/
@Data
public class Role {private String id;private String name;private String roleStr;}

新添roleId属性 

/*** @TableName user*/
@Data
public class User {private String id;private String username;private String password;private String currentFlag;private String roleId;
}
    <select id="findListByUserId" resultType="com.my.ssm.pojo.Perm">SELECT perm.*FROM user,user_role,role_perm,permWHERE user.id = #{userId}AND user.id=user_role.user_idAND user_role.role_id = role_perm.role_idAND role_perm.perm_id = perm.id</select>

3.修改UserDetailsServiceImpl.java,获取登录用户的权限信息

@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate PermMapper permMapper;/*** SpringSecurity会调用UserDetailsService的loadUserByUsername方法验证用户名是否合法,合法用户将用户信息和用户权限信息封装到UserDetailsImpl对象中.* @param username* @return*/@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
//        1.通过用户名查询User信息User user = userMapper.findUserByUsername(username);if (Objects.isNull(user)) {throw new RuntimeException("用户名不正确");}//2.查询用户的权限信息List<Perm> permList = permMapper.findListByUserId(user.getId());List<String> permStringList = new ArrayList<>();for (Perm perm : permList) {permStringList.add(perm.getPermStr());}//3.返回UserDetails接口的实现类对象return new UserDetailsImpl(user,permStringList);}
}

 4.修改UserDetailsImpl.java

@Data
@NoArgsConstructor
public class UserDetailsImpl implements UserDetails {private User user;private List<String> permissions;@JSONField(serialize = false)private List<GrantedAuthority> authorities;public UserDetailsImpl(User user, List<String> permissions) {this.user = user;this.permissions = permissions;}/*** 获取权限信息* @return*/@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {if (!Objects.isNull(authorities)) {return authorities;}// 将permissions授权信息封装到GrantedAuthority对象集合中authorities = new ArrayList<>();for (String permission : permissions) {SimpleGrantedAuthority authority = new SimpleGrantedAuthority(permission);authorities.add(authority);}return authorities;}/*** 获取密码信息* @return*/@Overridepublic String getPassword() {return this.user.getPassword();}/*** 获取用户名信息* @return*/@Overridepublic String getUsername() {return this.user.getUsername();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}

5.在Controller方法中配置权限信息 

@RestController
@RequestMapping("customer")
public class CustomerController {@GetMapping("firstMethod")@PreAuthorize("hasAuthority('customerPermission')")public String firstMethod() {return "这是自定义Controller的第一个方法";}
}

6.开启权限注解的支持

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {......
}

7.相关测试 

7.0准备数据

在role表中新增id为1的数据,并将lisi的role_id设置为1

 此时role_perm表为空表,说明任何角色都没有相应的权限

7.1登录,获取token

7.2访问自定义方法,发现被拒绝访问

 7.3将自定义方法的权限信息注释掉,再次访问自定义方法

 我们发现是可以访问的,说明权限信息的校验起效果了.

7.3在数据库中新添权限信息后访问

 

 将自定义Controller中的自定义方法上的权限信息取消注释

再次访问测试

 本篇文章的项目源码文件,可供点击下载学习 

http://www.xdnf.cn/news/3650.html

相关文章:

  • 论数据分片技术及其应用
  • 市面上所有大模型apikey获取指南(持续更新中)
  • 进程间通信(IPC)
  • 安卓基础(悬浮窗和摄像)
  • 基于大模型的肾结石诊疗全流程风险预测与方案制定研究报告
  • Oracle无法正常OPEN(四)
  • Spring AI 实战:第一章、Spring AI入门之DeepSeek调用
  • 天翼云ftp服务器搭建详细步骤,ftp服务器路径怎么写?
  • Centos9 安装 RocketMQ5
  • WebSocket分布式实现方案
  • MySQL中的窗口函数
  • Modbus 通讯协议(超详细,简单易懂)
  • Qt 中实现观察者模式(Observer Pattern)
  • Milvus(12):分析器
  • 虚拟机软件详解
  • AI日报 · 2025年5月03日|Perplexity 集成 WhatsApp,苹果传与 Anthropic 合作开发 Xcode
  • 青少年编程与数学 02-018 C++数据结构与算法 24课题、密码学算法
  • 【C#】一个类中的接口方法使用static和不使用static的区别
  • aidermacs开源程序使用 Aider 在 Emacs 中进行 AI 配对编程
  • 使用xlwings将excel表中将无规律的文本型数字批量转化成真正的数字
  • 自定义Dockerfile,发布springboot项目
  • Mysql进阶篇1_存储引擎、索引、SQL性能分析指令
  • 基于Jenkins的DevOps工程实践之Jenkins共享库
  • AVIOContext 再学习
  • Spring 容器相关的核心注解​
  • 19. LangChain安全与伦理:如何避免模型“幻觉“与数据泄露?
  • Linux电源管理(5)_Hibernate和Sleep功能介绍
  • ElasticSearch深入解析(九):Object、Nested、Flattened类型
  • 【RabbitMQ】 RabbitMQ快速上手
  • Python 函数装饰器和闭包(使用装饰器改进“策略”模式)