• SpringBoot-31-springboot整合shiro


    9.6.spring整合shiro

    • 新建springboot项目,导入web、thymeleaf、devtools、test启动器和lombok依赖
    • 在补充导入springboot整合shiro包,有这个依赖就不用导入shiro-core依赖了
    
      org.apache.shiro
      shiro-spring-boot-web-starter
      1.9.1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 项目结构

    在这里插入图片描述

    • 编写自定义UserRealm,供shiro的DefaultWebSecurityManager使用
    package com.example.config;
    
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    
    /**
     * @author CNCLUKZK
     * @create 2022/8/5-19:45
     */
    //自定义UserRealm extends AuthorizingRealm
    public class UserRealm extends AuthorizingRealm {
        //授权
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            System.out.println("执行了授权doGetAuthorizationInfo方法!");
            return null;
        }
    
        //认证
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            System.out.println("执行了认证doGetAuthenticationInfo方法!");
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 编写Shiro的配置类ShiroConfiguration,实现登陆拦截等功能

    这个配置累需要有三步操作,倒着code

    第一步:创建Realm对象,需要自定义类

    第二步:DefaultWebSecurityManager默认的SecurityManager安全管理器

    第三步:ShiroFilterFactoryBean,在ShiroFilter里面使用shiro的内置过滤器配置请求路径,无authc认证的用户无法进入相关页面,退出到登陆页面

    • shiro的内置过滤器

      	  anon:无需认证就可以访河
            authc: 必须认证了才能让河
            user: 必颈拥有记住我功能才能用
            perms: 拥有对某个资源的权限才能访问:
            role: 拥有某个角色权限才能访河
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 设置用户的登陆路径
    package com.example.config;
    
    import org.apache.shiro.mgt.DefaultSecurityManager;
    import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
    import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    /**
     * @author CNCLUKZK
     * @create 2022/8/5-19:45
     */
    @Configuration
    public class ShiroConfiguration {
    
        //第三步:ShiroFilterFactoryBean
        @Bean
        public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager securityManager){
            ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
            //设置安全管理器
            shiroFilterFactoryBean.setSecurityManager(securityManager);
    
            /*添shiro的内置过滤器,类型
                anon:无需认证就可以访河
                authc: 必须认证了才能让河
                user: 必颈拥有记住我功能才能用
                perms: 拥有对某个资源的权限才能访问:
                role: 拥有某个角色权限才能访河
            */
            Map filterChainDefinitionMap = new LinkedHashMap<>();
            /*也可以用通配符
            * filterChainDefinitionMap.put("/user/*","authc");*/
            filterChainDefinitionMap.put("/user/addUser","authc");
            filterChainDefinitionMap.put("/user/updUser","authc");
            shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
            //无认证权限时,设置登陆请求
            shiroFilterFactoryBean.setLoginUrl("/user/toLogin");
            return shiroFilterFactoryBean;
        }
    
        //第二步:DefaultWebSecurityManager
        @Bean(name = "defaultWebSecurityManager")
        public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            //关联UserRealm
            securityManager.setRealm(userRealm);
            return securityManager;
        }
    
        //第一步:创建Realm对象,需要自定义类
        @Bean
        public UserRealm userRealm(){
            return new UserRealm();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    spring.thymeleaf.cache=false
    
    • 1
    • 前端这些页面都是简单的测试页面,其中login页面沿用springSecurity的测试用例

    • 主页index.html

    
    
    
        
        Title
    
    
    

    首页

    信息显示

    添加|修改
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 启动服务测试访问http://127.0.0.1:8080/user/,显示下图说明spring整合shiro整合成功
      在这里插入图片描述

    9.7.shiro实现用户认证

    • 在上面环境的基础上进行开发
    • 在自定义UserRealm的认证方法中添加认证信息,注意密码认证,shiro做
    • shiro的可定制化程度高于springSecurity
    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行了认证doGetAuthenticationInfo方法!");
        //用户名密码后续会数据中取
        String username = "admin";
        String password = "111111";
        UsernamePasswordToken userToken = (UsernamePasswordToken) token;
        if (!userToken.getPrincipal().equals(username)) {
            return null; //抛出UnknownAccountException异常
        }
        //密码认证,shiro做
        return new SimpleAuthenticationInfo("",password,"");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 之后在MyController中使用shiro的方法获取Subject,生成token供自定义UserRealm的认证使用
    @RequestMapping("/login")
    public String login(String username,String password,Model model){
        Subject subject = SecurityUtils.getSubject();
        //全局token
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token);
            return "index";
        } catch (UnknownAccountException uae) {
            model.addAttribute("msg",token.getPrincipal()+" is not correct");
            return "login";
        } catch (IncorrectCredentialsException ice) {
            model.addAttribute("msg","Password for account " + token.getPrincipal() + " was incorrect!");
            return "login";
        } catch (LockedAccountException lae) {
            model.addAttribute("msg","The account for username " + token.getPrincipal() + " is locked.  " +
                    "Please contact your administrator to unlock it.");
            return "login";
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 测试访问http://127.0.0.1:8080/点击登录,输入错误的密码admin/123
      在这里插入图片描述

    在这里插入图片描述

    • 输入正确密码后转到首页

    下一篇:SpringBoot-32-shiro整合mybatis

  • 相关阅读:
    CSDN竞赛57期题解
    数据库2-mysql环境搭建
    Transformer——encoder
    EXCEL表格-批量去除百分号%的三种方案
    【I2C】熟悉I2C的传输时序。根据I2C的时序图,标出每段时序对应的含义
    新旅程、新经营丨神策 2023 数据驱动大会 10 月 27-28 日北京见
    云原生Kubernetes:K8S安全机制
    原来还能这样看Java线程的状态及转换
    c# 学习教程
    设计模式-迭代器模式-笔记
  • 原文地址:https://blog.csdn.net/weixin_42045639/article/details/126484600