2012-05-23 3 views
5

openId 공급자 인증에 성공한 후 사용자 openId 식별자와 연결된 db에 계정이 없다는 것을 발견했습니다.스프링 보안 openId 지원 및 사용자 deauthentication

상황을 어떻게 처리해야하는지 알려주실 수 있습니까? 이제 등록 양식을 표시하고 사용자에게 계정 생성을 요청합니다. 그러나 사용자 인증 상태에 문제가 있습니다. 이제 스프링 SecurityContext 클래스에 의해 인증 된 것으로 보입니다.

'새 사용자 페이지 등록'으로 리디렉션하기 전에 컨트롤러 동작에서 사용자를 어떻게 인증 해제합니까? 이 방법이 좋은 방법입니까 아니면 다른 방법으로해야합니까?

답변

2

좋아, 사무엘의 게시물에서 언급 한 바와 같이 인증을 승인과 분리하는 것이 정말 도움이되었습니다. 그러나 여전히 많은 문제가 있으며 사용자에게 새로운 역할을 추가하는 쉬운 방법이 없으므로 인증 해제가 반드시 필요하다는 것을 알았습니다. 따라서 가장 쉬운 방법은 사용자가 다시 로그인하도록하고 로그인 중에 스프링이 역할 할당을 처리하도록하는 것입니다. 위해

봄 보안에 비인증 사용자에 당신이 호출 할 수있다 : 당신이 당신의 UserDetailsService의 구현에서 예외를 던질 수있는 대안으로

SecurityContextHolder.clearContext(); 

(아래 참조). 그것은 새로운 사용자 계정을 새로운 로컬 계정을 만드는 과정에서 openid 계정과 일치시킬 수 없으므로 사용자 인증을 취소하고 사용자 컨텍스트 데이터를 잃어 버릴 수 있다는 단점이 있습니다. 그리고 기존 사용자 이름과 암호로 사용자 로그인 후 해당 계정을 일치시켜야합니다. 내 솔루션은 새 계정을 만든 직후에 사용자의 인증을 취소하는 것이 었습니다.

public final class MyUserDetailsService implements UserDetailsService { 
    private final UsersDao usersDao; 

    @Autowired 
    public UserDetailsServiceImpl(final UsersDao usersDao) { 
     this.usersDao = usersDao; 
    } 

    @Override 
    public UserDetails loadUserByUsername(final String username) {  
      UserEntity user = usersDao.getUserByOpenIdIdentifier(username); 
      if (user == null) { 
        // there is no such user in our db, we could here throw 
        // an Exception instead then the user would also be deuthenticated 
        return new User(username, "", new ArrayList<GrantedAuthority>()); 
      } 

      //here we are granting to users roles based on values from db 
      final Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
      authorities.add(new SimpleGrantedAuthority(user.getUserType().toString())); 

      final UserDetails result = new User(username, "", authorities); 

      return result; 
    } 
} 
: 여기이 유용, 당신은 UserDetailsService도를 오버라이드 (override) 할 필요가 사용자 역할 (권한)을 부여 할 경우 사람에하기 위해

내 구현

1

인증승인이라는 두 개념을 혼합한다고 생각합니다. 인증은 사용자가 누구인지 알고, 권한 부여는 기능의 리소스에 대한 액세스 권한을 사용합니다. 스프링 보안

이 두 개념은 인증 매니저액세스 의사 관리자에 의해 구현된다.

사용자가 데이터베이스에 존재하지 않는다는 사실은 사용자가 신원을 부정하는 이유는 아닙니다. 즉, 인증 해제가 아닙니다! 그러나 인증 된 beeing은 액세스 결정 관리의 기준이 될 수 있습니다. 예 : AuthenticatedVoter.

당신은 인증에 접촉하지만, 다음과 같은 규칙을 적용 할 수있는 액세스 의사 관리자를 지정하지 않아야

  • 데이터베이스에 존재하는 사용자 계정 생성 기능을 제외한 모든에 액세스 할 수 있습니다
  • 데이터베이스에없는 사용자는 계정 작성 기능에만 액세스 할 수 있습니다.

이것은 모두 인증이 아니라 액세스 관리에 관한 것입니다.

더 읽기 http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-access-manager

PS에서 : 문서 봄 보안에 철저한 아니라, 소스 코드를 매우 읽을 수 있습니다. 내 조언은 그것을 확인하고 사용자 정의해야하는 요소의 구현을 살펴 보는 것입니다.