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

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中的自定义方法上的权限信息取消注释

再次访问测试

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

相关文章:

  • redis延时队列详细介绍
  • 计算机基础:二进制基础17,八进制减法
  • 第 13 届蓝桥杯 C++ 青少组省赛中 / 高级组 2022 年真题(编程第一题)
  • 360驱动大师v2.0(含网卡版)驱动工具软件下载及安装教程
  • 【AI面试准备】银行UI测试效率提升案例解析
  • LeetCode算法题 (设计链表)Day16!!!C/C++
  • [Vue]props解耦传参
  • Python刷题:流程控制(下)
  • 基于开源AI大模型与AI智能名片S2B2C商城小程序的线上活动执行优化研究
  • Java开发经验——ali编码规范经验总结
  • 【Mytais系列】Type模块:源码
  • centos7.0无法安装php8.2/8.3
  • 【大模型面试每日一题】Day 7:为什么大模型训练选择 Adam 而非 SGD?Adam 的关键改进是什么?
  • 使用PageHelper实现分页查询(详细)
  • LangChain:重构大语言模型应用开发的范式革命
  • 游戏引擎学习第255天:构建配置树
  • 定时器6计时功能
  • 【算法基础】插入排序算法 - JAVA
  • 【计算机视觉】目标检测:yoloV1~yoloV11项目论文及对比
  • SQL中的Subquery CTE Temporary Table 区别
  • 41年轮回,从洛杉矶奔向洛杉矶,李宁故地重游再出发
  • 以色列计划“占领加沙”,特朗普下周中东行结束之际将是“机会窗口”
  • 新加坡总理黄循财领导人民行动党胜选,外交部回应
  • A股高开高走,三大股指涨超1.1%:两市成交1.3万亿元,近5000股收涨
  • 4月份全球制造业PMI继续下降,经济下行压力有所加大
  • 国产基因测序仪龙头华大智造业绩持续承压,今年有望迎来拐点?