한 걸음 한 걸음 shiro - 2 설정 을 가르쳐 주 고 realm 을 사용자 정의 합 니 다.

7147 단어
  • 한 걸음 한 걸음 shiro - 1 로 shiro 프레임 워 크 도입
  • 한 걸음 한 걸음 shiro - 2 설정 과 사용자 정의 realm
  • 을 가르쳐 줍 니 다.
  • shiro - 3 설정 및 사용자 정의 session Manager
  • 한 걸음 한 걸음 shiro - 4 설정 을 사용 하고 session Dao
  • 를 사용자 정의 하 는 것 을 가르쳐 줍 니 다.
  • 한 걸음 한 걸음 shiro - 5 설정 remembeMe
  • 한 걸음 한 걸음 shiro - 6 총화 와 소감
  • 을 가르쳐 준다.
    shiro 에서 realm 은 인증 과 권한 을 수 여 받 은 구성 요소 로 몇 가지 실현 을 가 져 왔 습 니 다. 예 를 들 어 jdbc Realm 과 iniRealm 등 실제 프로젝트 에서 모두 자신 이 realm 을 실현 할 것 입 니 다.
  • 먼저 사용자 표를 만 들 고 사용자 이름, 비밀번호, 권한 정 보 를 저장 해 야 합 니 다
  • CREATE TABLE IF NOT EXISTS `user` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '  ID',
      `user_name` varchar(10) NOT NULL DEFAULT '' COMMENT '   ',
      `password` varchar(50) NOT NULL DEFAULT '' COMMENT '    ,     ,  md5',
      `roles` varchar(20) NOT NULL DEFAULT '' COMMENT '   ,    ',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '    ',
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '    ',
      PRIMARY KEY (`id`),
      UNIQUE KEY `uniq_idx_role_name` (`user_name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='   ';
    
  • dao 추가 삭제 검사 (사용 하 는 my batis 대리 dao) 를 실현 하고 service 실제 조작 user 표
  • 를 봉 합 니 다.
    @Service
    public class UserService {
        //mybatis     dao
        @Resource
        private UserDao userDao;
    
        //       user  
        public User queryUserByName(String name) {
            try {
                if (StringUtils.isBlank(name)) {
                    return null;
                }
                return userDao.queryUserByName(name);
            } catch (Exception e) {
                log.error("db error when query user:{}", name, e);
            }
            return null;
        }
        
        //              
        public Set queryUserRole(String userName) {
            User user = queryUserByName(userName);
            if (user == null) {
                return Collections.emptySet();
            }
            List roleList = StringAssist.splitComma(user.getRoles());
            return Sets.newHashSet(roleList);
        }
    }
    
  • 사용자 정의 MyRealm 계승 AuthorizingRealm, 각각 인증 과 권한 수 여 를 실현 하 는 방법
  • doGetAuthenticationInfo 는 인증 방법 으로 사용자 가 로그 인 할 때 호출 됩 니 다. 예 를 들 어 아래
  •      @PostMapping("login")
        public String login(String username, String password) {
            try {
                //shiro  SecurityUtils.getSubject()    ,            ,      
                Subject subject = SecurityUtils.getSubject();
                //     ,            
                if (subject.isAuthenticated()) {
                    return "redirect:/static/html/indexLogin.html";
                }
                //     UsernamePasswordToken,shiro token  Principal Credentials   
                //Principal             ,Credentials            
                //UsernamePasswordToken username  Principal,password  Credentials
                UsernamePasswordToken token = new UsernamePasswordToken(username, password);
                //rememberMe     
                token.setRememberMe(true);
                subject.login(token);
            } catch (AuthenticationException e) {
                //              ,           
                return "redirect:/static/html/loginError.html";
            }
            return "redirect:/static/html/indexLogin.html";
        }
    
  • doGetAuthorizationInfo 는 권한 을 부여 하 는 방법 으로 차단기 에서 권한 검 사 를 할 때 호출 됩 니 다
  • public class MyRealm extends AuthorizingRealm {
    
        @Resource
        private UserService userService;
    
        //         roles   permission     ,                 
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            //principals.getPrimaryPrincipal()          
            if (principals == null || StringUtils.isBlank((String) principals.getPrimaryPrincipal())) {
                return null;
            }
            //         SimpleAuthorizationInfo
            return new SimpleAuthorizationInfo(userService.queryUserRole((String) principals.getPrimaryPrincipal()));
        }
    
        //token     login    UsernamePasswordToken
        //getPrincipal()     getUsername(),getCredentials()    getPassword()
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            if (token == null||StringUtils.isBlank((String) token.getPrincipal())) {
                return null;
            }
            //  token       ,  user  
            User user = userService.queryUserByName((String) token.getPrincipal());
            if (user == null) {
                return null;
            }
            //SimpleAuthenticationInfo          ,            、  、        
            //                   md5       ,    ,      ,           
            //getName()   realm   ,            realm,    ,     realm
            //      ,    token SimpleAuthenticationInfo    ,    Principal(),   token Credentials
            //  md5  SimpleAuthenticationInfo     ,     SimpleAuthenticationInfo Credentials  
            return new SimpleAuthenticationInfo(
                    user.getUserName(), user.getPassword(), ByteSource.Util.bytes(user.getUserName()), getName());
        }
    
  • security Manager 에 realm 을 주입 합 니 다. 그 중에서 authenticator 는 realms 보다 먼저 주입 해 야 한 다 는 점 이 매우 중요 합 니 다. 저 는 그 전에 어떻게 든 권한 을 부여 할 수 없 었 습 니 다. debug 는 authenticator 중의 realms 가 비어 있다 는 것 을 발 견 했 습 니 다
  •     
        
            
            
            
                
                    
                        
                    
                
            
            
            
            
                
                    
                        
                            
                                
                                
                                
                                
                            
                        
                    
                
            
        
    
  • PS: 사용자 의 원래 비밀 번 호 를 지정 하여 md5 소금 암호 화 를 통 해 검 사 를 했 기 때문에 사용자 가 등록 할 때 데이터 베 이 스 를 저장 하 는 비밀번호 도 5 번 md5 소금 암호 화 를 거 쳤 습 니 다.shiro 는 Md5Hash 도구 클래스 를 제공 합 니 다. new Md5Hash ("원본 비밀번호", "소금 값", 5). toString () 을 통 해 암호 화 된 비밀 번 호 를 볼 수 있 습 니 다.
  • 좋은 웹페이지 즐겨찾기