SpringBoot集成shiro实现简单的用户认证,角色授权

Dear 丶 2022-10-27 14:55 114阅读 0赞

SpringBoot集成shiro

  • 1.导入依赖
  • 2.编写shrio配置类
  • 3.编写自定义realm
  • 4.编写测试接口
  • 5.业务逻辑工作图

1.导入依赖

  1. <dependency>
  2. <groupId>io.springfox</groupId>
  3. <artifactId>springfox-boot-starter</artifactId>
  4. <version>3.0.0</version>
  5. </dependency>

2.编写shrio配置类

  1. @Configuration
  2. public class ShiroConfig {
  3. //创建shiroFilter,处理所有shiro的请求
  4. @Bean
  5. public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager defaultWebSecurityManager){
  6. //创建shiro的filter
  7. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  8. //注入安全管理器
  9. shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
  10. return shiroFilterFactoryBean;
  11. }
  12. @Bean
  13. public DefaultWebSecurityManager getSecurityManager(Realm realm){
  14. DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
  15. defaultWebSecurityManager.setRealm(realm);
  16. return defaultWebSecurityManager;
  17. }
  18. @Bean
  19. public Realm getRealm(){
  20. return new UserRealm();//UserRealm是自己编写的自定义realm,realm中完成shiro授权和认证的编写
  21. }
  22. }

3.编写自定义realm

  1. public class UserRealm extends AuthorizingRealm {
  2. @Autowired
  3. UserMapper userMapper;
  4. //授权操作的实现
  5. @Override
  6. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
  7. //获取用户信息,主要是指的用户名
  8. String primaryPrincipal = (String) principalCollection.getPrimaryPrincipal();
  9. //根据用户名去查询用户的角色,这里我封装了一个工具类可以完成根据用户名去查询用户的角色的功能,并返回角色字符串
  10. String roleByUserName = GetRoleByUserNameUtil.getRoleByUserName(primaryPrincipal);
  11. //声明一个查SimpleAuthorizationInfo对象
  12. SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
  13. //通过SimpleAuthorizationInfo对象给用户添加角色
  14. simpleAuthorizationInfo.addRole(roleByUserName);
  15. return simpleAuthorizationInfo;
  16. // return null;
  17. }
  18. //认证操作的实现
  19. @Override
  20. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
  21. String principal = (String) authenticationToken.getPrincipal();
  22. QueryWrapper<User> wrapper=new QueryWrapper<>();
  23. wrapper.eq("userName",principal);
  24. User user = userMapper.selectOne(wrapper);
  25. if (null != user){
  26. SimpleAuthenticationInfo simpleAuthenticationInfo =
  27. new SimpleAuthenticationInfo(principal,user.getPassword(),this.getName());
  28. return simpleAuthenticationInfo;
  29. }
  30. return null;
  31. }
  32. }

4.编写测试接口

  1. @RestController
  2. public class TestLogin {
  3. @Autowired
  4. UserService userService;
  5. //测试认证的接口
  6. @PostMapping("/user/login")
  7. public void testLoginAndShiro(User user){
  8. UsernamePasswordToken token = new
  9. UsernamePasswordToken(user.getUserName(), user.getPassword()); //将用户的密码和用户名生成一个token
  10. Subject subject = SecurityUtils.getSubject(); //通过全局安全工具类来获取用户subject对象
  11. try {
  12. subject.login(token); //调用subject的login来进行认证,会调用realm的doGetAuthenticationInfo方法
  13. System.out.println("状态" + subject.isAuthenticated());
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. //对授权操作的测试接口
  19. @RequiresRoles("user") //该注解要求拥有user这个角色才可以访问
  20. @GetMapping("/user/uuu")
  21. public String testAuthorization(){
  22. return "lihai";
  23. }
  24. }

5.业务逻辑工作图

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,114人围观)

还没有评论,来说两句吧...

相关阅读