SpringBoot 2.0 을 사용 하여 기업 급 응용 개발 프레임 워 크 구축(7)통합 Shiro

6974 단어 SpringBoot
  • 준비
  • 우선 사용자 권한 표 만 들 기
    //   
    CREATE TABLE `sys_user` (
      `id` varchar(32) NOT NULL COMMENT 'id',
      `username` varchar(64) DEFAULT NULL COMMENT '   ',
      `password` varchar(64) DEFAULT NULL COMMENT '  ',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='   ';
    INSERT INTO `demo`.`sys_user` (`id`, `username`, `password`) VALUES ('1', 'admin', '123456');
    
    //   
    CREATE TABLE `sys_role` (
      `id` varchar(32) NOT NULL COMMENT 'id',
      `role_name` varchar(32) DEFAULT NULL COMMENT '    ',
      `role_desc` varchar(32) DEFAULT NULL COMMENT '  ',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='   ';
    INSERT INTO `demo`.`sys_role` (`id`, `role_name`, `role_desc`) VALUES ('1', 'ROLE_ADMIN', '   ');
    
    //  -   
    CREATE TABLE `sys_user_role` (
      `id` varchar(32) NOT NULL COMMENT 'id',
      `user_id` varchar(32) DEFAULT NULL COMMENT '  id',
      `role_id` varchar(32) DEFAULT NULL COMMENT '  id',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='     ';
    INSERT INTO `demo`.`sys_user_role` (`id`, `user_id`, `role_id`) VALUES ('1', '1', '1');

     그리고 앞서 말 한 generator 로 실 체 를 만 듭 니 다.
  • 통합
  • 우선 Shiro 의 의존 도 를 추가 합 니 다.
    
    
        org.apache.shiro
        shiro-spring-boot-web-starter
        1.4.0
    

    그리고 사용자 정의 Realm 만 들 기
    public class MyRealm extends AuthorizingRealm {
    
        @Autowired
        private SysUserMapper sysUserMapper;
    
        //  
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)
                throws AuthenticationException {
            //          
            String username = (String) authenticationToken.getPrincipal();
    
            //              
            SysUser user = sysUserMapper.findByUserName(username);
            if (user == null) {
                log.info("      {}   ",username);
                throw new UnknownAccountException("                ");
            }
    
            SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(),getName());
            return info;
        }
    
        //  
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            //         
            String username = (String) SecurityUtils.getSubject().getPrincipal();
            //           
            SysUser user = sysUserMapper.findByUserName(username);
            //         
            List roleList = user.getRoles();
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            log.debug("  {}      :");
            for (SysRole role : roleList) {
                //      
                info.addStringPermission(role.getRoleName());
            }
            return info;
        }
    }

    config 클래스 만 들 기
    @Configuration
    public class ShiroConfiguration {
    
        @Bean
        public MyRealm realm(){
            return new MyRealm();
        }
    
        //  shiro-spring-boot-starter 1.4 ,     SecurityManager   ,    shiro-spring    
        @Bean
        public DefaultWebSecurityManager securityManager(MyRealm realm){
            DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();
            securityManager.setRealm(realm);
            return securityManager;
        }
    
        @Bean
        public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
            return new LifecycleBeanPostProcessor();
        }
    
        @Bean
        public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){
            ShiroFilterFactoryBean shiroFilterFactoryBean  = new ShiroFilterFactoryBean();
            //      SecurityManager
            shiroFilterFactoryBean.setSecurityManager(securityManager);
    
            //             Web       "/login.jsp"  
            shiroFilterFactoryBean.setLoginUrl("/login");
            //            
            shiroFilterFactoryBean.setSuccessUrl("/index");
            //     ;
            shiroFilterFactoryBean.setUnauthorizedUrl("/403");
    
            //   .
            Map filterChainDefinitionMap = new LinkedHashMap();
            //       ,          Shiro        
            filterChainDefinitionMap.put("/logout", "logout");
            //      ,        ,    /**       :      ,           ;
            // authc:  url            ; anon:  url        
            filterChainDefinitionMap.put("/login", "anon");
            filterChainDefinitionMap.put("/login.html", "anon");
            filterChainDefinitionMap.put("/**", "authc");
    
            shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
    
            return shiroFilterFactoryBean;
        }
    }

    로그 인 테스트 생 성
    @Controller
    public class ShiroController {
    
        @GetMapping("/login")
        public String login(){
            return "redirect:login.html";
        }
    
        @PostMapping("/login")
        public String login(String username, String password){
            Subject user = SecurityUtils.getSubject();
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            String returnUrl = "redirect:index.html";
            String a = "1";
            try {
                //shiro          ,           ,       UserRealm           
                user.login(token);
            } catch (UnknownAccountException e) {
                //     
                returnUrl = "redirect:login.html?error=0";
                //                           ,            
            } catch (DisabledAccountException e) {
                //     
                returnUrl = "redirect:login.html?error=1";
            } catch (IncorrectCredentialsException e) {
                //    
                returnUrl = "redirect:login.html?error=2";
            } catch (Throwable e) {
                //    
                returnUrl = "redirect:login.html?error=3";
            } finally {
                return returnUrl;
            }
        }
    }

    login.html
    
    
    
        
        Title1
    
    
        



    집적 중인 구덩이
    1.config 클래스 의 security Manager()반환 형식
    jar 가 spring-shiro 를 사용 하면 Security Manager 로 돌아 가면 됩 니 다.shiro-spring-boot-starter 1.4 를 사용 하면 Default WebSecurity Manager 로 돌아 가 야 합 니 다.그렇지 않 으 면 오류 가 발생 합 니 다.
    2.다 중 환경 설정
    다 중 환경 설정 에 서 는 resources 디 렉 터 리 에 불 러 온 파일 을 수 동 으로 정의 해 야 하기 때문에 html 를 넣 는 것 을 잊 지 마 세 요.
    3.페이지 전환 문제
    return"xx.html"방식 을 사용 하면 로그 인 할 때 제출 폼 이 post 이 고 xx.html 에 접근 하 는 것 이 get 방법 이기 때문에 오류 가 발생 할 수 있 습 니 다.redirect 또는 forward 를 사용 해 야 합 니 다.

    좋은 웹페이지 즐겨찾기