SpringSecurity 동적 로드 사용자 역할 권한 로그 인 및 인증 기능 실현


많은 사람들 이 Spring Security 가 로그 인 검증 을 실현 하 는 것 이 어렵다 고 생각 했 고 저 는 처음에 공 부 를 했 을 때 도 그렇게 생각 했 습 니 다.사용자 이름 비밀 번 호 를 받 는 데 사용 할 컨트롤 러 와 Spring Security 를 결합 해서 어떻게 사용 해 야 하 는 지 오 랜 만 에 알 아 봤 기 때문이다.이것 은 선입견 적 인 오류 이다.나중에 나 는 네가 직접 Controller 를 쓸 필요 가 없다 는 것 을 알 게 되 었 다.
Spring Security 사용자 정보,캐릭터 정보,권한 정보,로그 인 페이지 가 무엇 인지 만 알려 주 시 겠 습 니까?로그 인 성공 페이지 는 무엇 입 니까?로그 인 에 관 한 다른 모든 정보.구체 적 인 로그 인 검증 논 리 를 통 해 실현 할 수 있 습 니 다.
1.동적 데이터 로그 인 검증 의 기초 지식
본 호 이전 글 에 서 는 Spring Security 의 formLogin 로그 인 인증 모드,RBAC 의 권한 제어 관리 모델 을 소개 하고 Spring Security 의 로그 인 인증 논리 소스 코드 를 분석 했다.Google 의 모든 사용자,역할,권한 정 보 는 설정 파일 에 기록 되 어 있 지만 실제 업무 시스템 에 서 는 RBAC 권한 모델 의 데이터베이스 시트 에 저 장 됩 니 다.다음은 그 중의 핵심 개념 을 살 펴 보 자.
  • RBAC 의 권한 모델 은 사용자 로부터 사용자 에 게 분 배 된 하나 이상 의 역할 을 가 져 올 수 있 고 사용자 의 역할 에서 이 역할 의 다양한 권한 을 가 져 올 수 있다.관련 조 회 를 통 해 특정한 사용자 의 역할 정보 와 권한 정 보 를 얻 을 수 있 습 니 다.
  • 원본 코드 분석 글 에서 사용자,역할,권한 정 보 를 설정 에 쓰 지 않 으 려 면 알 고 있 습 니 다.저 희 는 User Details 와 User Details Service 인 터 페 이 스 를 실현 하여 데이터베이스 나 다른 저장 소 에서 이 정 보 를 동적 으로 불 러 와 야 합 니 다.
  • 이상 은 일부 핵심 적 인 기초 지식 에 대한 정리 입 니 다.만약 에 이런 지식 에 대해 명확 하지 않 으 면 먼저 본문 을 읽 는 것 을 권장 합 니 다.만약 본문 을 보고 도 여전히 어려움 을 이해한다 면,당신 은 본 호의 이전의 문장 을 뒤 져 보 는 것 을 건의 합 니 다.
    2.UserDetails 와 UserDetails Service 인터페이스
  • UserDetailsService 인터페이스 에 loadUserByUsername 라 는 방법 이 있 습 니 다.저 희 는 동적 으로 사용자,역할,권한 정 보 를 불 러 오 는 것 이 바로 이 방법 을 실현 하 는 것 입 니 다.함수 이름 알 기:사용자 이름 으로 사용 자 를 불 러 옵 니 다.이 방법의 반환 값 은 바로 UserDetails 이다.
  • User Details 는 사용자 정보,즉 사용자 이름,비밀번호,이 사용자 가 가 진 권한 이다.
  • 다음은 User Details 인터페이스 에 어떤 방법 이 있 는 지 살 펴 보 겠 습 니 다.
    
    public interface UserDetails extends Serializable {
     //         
     Collection<? extends GrantedAuthority> getAuthorities();
     //    
     String getPassword();
     //     
     String getUsername();
     //       
     boolean isAccountNonExpired();
     //        
     boolean isAccountNonLocked();
     //       
     boolean isCredentialsNonExpired();
     //      
     boolean isEnabled();
    }
    이제 우 리 는 이러한 정 보 를 Spring Security 에 제공 하면 Spring Security 는 로그 인 검증 을 어떻게 하 는 지 알 수 있 고 우리 가 직접 Controller 를 써 서 로그 인 검증 논 리 를 실현 할 필요 가 없다 는 것 을 알 게 되 었 다.
    3.사용자 세부 정보 인터페이스 실현
    
    public class SysUser implements UserDetails{
     String password(); //  
     String username(); //   
     boolean accountNonExpired; //     
     boolean accountNonLocked; //      
     boolean credentialsNonExpired; //     
     boolean enabled; //      
     Collection<? extends GrantedAuthority> authorities; //       
     //      
     //  set  
     //  get  (   UserDetails   )
    }
    우 리 는 UserDetails 에 적응 하 는 자바 POJO 류 를 썼 습 니 다.이른바 UserDetails 인터페이스 실현 은 get 방법 입 니 다.get 방법 은 Spring Security 에서 호출 되 며,set 방법 이나 구조 함 수 를 통 해 Spring Security 에 User Details 데 이 터 를 제공 합 니 다.
    4.UserDetailsService 인터페이스 실현
    
    @Component
    public class MyUserDetailsService implements UserDetailsService{
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
      
     //      sys_user          。loadUser     Mybatis JDBC JPA    。
     SysUser sysUser = loadUser(username); 
     //          
     if(user == null) { throw new UsernameNotFoundException("      "); }
     //              ,       
     //     ROLE      Authority  (  、  )。
     //            ,        。
     sysUser.setAuthorities(  AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_AMIN , system:user:delete")); 
     //sysUser.setAccountNonLocked(true false);
     return sysUser;
     }
    }
  • 일반 데이터베이스 테이블 sysuser 필드 는 SysUser 속성 과 일일이 대응 해 야 합 니 다.예 를 들 어 username,password,enabled.그러나 예 를 들 어 accontNonLocked 필드 는 여러 번 로그 인 하 는 데 사 용 됩 니 다.그러나 저 희 는 표 에 잠 금 여 부 를 저장 하지 않 고 잠 금 시간 필드 를 저장 합 니 다.잠 금 시간 이 현재 시간 보다 큰 지 여 부 를 통 해 계 정 이 잠 겨 있 는 지 여 부 를 판단 하기 때문에 실현 과정 에서 유연 하 게 판단 하고 set 방법 을 잘 사용 할 수 있 으 며 일일이 대응 하 는 형식 에 구 애 받 지 않 아 도 된다.
  • 캐릭터 는 특수 한 권한 입 니 다.Spring Security 에서 저 희 는 hasRole(캐릭터 표지)표현 식 으로 사용자 가 특정한 역할 을 가지 고 있 는 지 판단 하고 그 가 특정한 조작 을 할 수 있 는 지 여 부 를 결정 할 수 있 습 니 다.hasAuthority(권한 표지)표현 식 을 통 해 어떤 조작 권한 이 있 는 지 판단 합 니 다.
  • 마지막 설명
    이로써 저 희 는 시스템 안의 모든 사용자,역할,권한 정 보 를 UserDetails Service 와 User Details 를 통 해 Spring Security 에 알 렸 습 니 다.그러나 대부분의 친구 들 은 로그 인 기능 을 어떻게 실현 해 야 할 지 모 를 수도 있 습 니 다.사실은 남 은 일 은 간단 합 니 다.
  • 로그 인 인터페이스 를 작성 하고 로그 인 폼 을 작성 합 니 다.폼 은 post 방법 으로 기본/login 경로
  • 에 제출 합 니 다.
  • 폼 의 사용자 이름,암호 필드 이름 은 기본적으로 username,password 입 니 다.
  • 로그 인 성공 후 점프 페이지 를 작성 합 니 다.예 를 들 어 index.html
  • 그리고 이 정 보 를 설정 방식 으로 Spring Security 에 알 리 면 이상 의 설정 정보 이름 은 유연 하 게 수정 할 수 있 습 니 다.설정 방법 을 모 르 시 면 본 호의 이전 글 인 formLogin 로그 인 인증 모드 을 참고 하 십시오.
    총결산
    위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 SpringSecurity 동적 으로 사용자 역할 권한 을 불 러 와 로그 인 및 감 권 기능 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
    만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

    좋은 웹페이지 즐겨찾기