2013-08-13 3 views
16

나는 이것이 여러 번 대답되었지만 나는 혼란 스럽다는 것을 알고있다. 이미 애플리케이션에 인증 메커니즘이 있으며 스프링 MVC의 인증 부분 만 사용하려고합니다. 저는 Spring MVC 3와 Spring Security 3을 사용하고 있습니다.Spring Security 3에서 커스텀 인증을 구현하는 방법은 무엇입니까?

인터넷에서 검색 할 때 두 가지 해결책을 찾았습니다. 첫 번째 것은 AuthenticationProvider 인터페이스를 구현하는 것입니다. Example1. 두 번째는 UserDetails와 UserDetailsService, Example2을 구현하여 여기에서 분실했습니다.

---- ---- 업데이트

질문의 두 번째 부분은 here이다. 그리고 해결 방법에 대한 해결책.

답변

37

인증 및 인증 역할에 사용자 이름과 암호 만 사용하는 경우 대부분 자신의 UserDetailsService를 구현하면 충분합니다.

사용자 이름 패스워드 인증의 흐름은 다음과 같이 일반적으로 다음이다 :

  • 봄 보안 필터 (기본 인증/모양/..) 사용자 이름과 비밀번호를 집어 UsernamePasswordAuthentication 객체로 바뀌고 AuthenticationManager에
  • 인증 관리자가이 경우 DaoAuthenticationProvider가 인 UsernamePasswordtokens 처리 및 인증 따라 토큰을 통과 할 수있는 후보 제공자를 찾는다에게 건네
  • 인증 공급자는 방법 loadUse를 호출 rByUsername 인터페이스를 사용하고 사용자가 없거나 사용자 이름, 암호 및 권한이 포함 된 UserDetails 객체를 반환하는 경우 UsernameNotFound 예외를 throw합니다.
  • 그러면 인증 공급자는 제공된 UsernamePasswordToken 및 UserDetails 개체의 암호를 비교합니다. (PasswordEncoders를 통해 암호 해시도 처리 할 수 ​​있습니다.) 일치하지 않으면 인증에 실패합니다. 일치하는 경우 사용자 세부 정보 객체를 등록하고 승인 부분을 수행하는 AccessDecisionManager로 전달합니다.

DaoAuthenticationProvider의 확인이 필요에 맞으면. 그렇다면 자신 만의 UserDetailsService를 구현하고 DaoAuthenticationProvider의 확인을 조정하면됩니다. 다음과 같이 스프링 3.1을 사용하는 경우 UserDetailsService에 대한

예는 다음과 같습니다

봄 XML :

<security:authentication-manager> 
    <security:authentication-provider user-service-ref="myUserDetailsService" /> 
</security:authentication-manager> 

<bean name="myUserDetailsService" class="x.y.MyUserDetailsService" /> 

UserDetailsService의 구현 :

public MyUserDetailsService implements UserDetailsService { 

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
    //Retrieve the user from wherever you store it, e.g. a database 
    MyUserClass user = ...; 
    if (user == null) { 
     throw new UsernameNotFoundException("Invalid username/password."); 
    } 
    Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("Role1","role2","role3"); 
    return new User(user.getUsername(), user.getPassword(), authorities); 
} 

} 
+0

나는 그것이 작동하는지 알려 드리겠습니다. 감사. –

+0

이렇게하면 로그인 워크 플로를 사용자 정의 할 수 없습니다. 5 번째 시도에서 사용자를 차단하거나 이메일을 보내려고합니다. 이것은 내가 찾는 것입니다. –

+0

제안 사항은 DAOAuthenticationManager를 서브 클래스 화하고, 인증 메소드를 오버라이드하고, try catch에서 super.authenticate를 호출하는 것입니다. – Nils

관련 문제