2013-04-16 1 views
0

나는 "닭고기 달걀"문제가 있습니다. 응용 프로그램에서 UserDetailsService를 사용하여 User를 얻습니다. 우리는 DB에 사용자 정보를 저장하지 않고 제 3 자 서비스를 사용하여 실제로 모든 정보를 얻습니다.봄. 자바. 로그인 및 활성화 이메일

최근에 계정 활성화 기능이 추가되었습니다. 등록한 후 사용자에게 활성화 이메일을 보내고 사용자가 클릭하면 Google을 해당 사용자로 표시하고 로그인 페이지로 리디렉션합니다. 사용자는 ACTIVE 상태 인 경우에만 로그인 할 수 있습니다. 문제는 : 로그인하지 않아도 계정을 활성화 한 날짜부터 요금을 부과하기 시작합니다. 스프링 보안을 사용하면 어떻게 이러한 프로세스 (활성화 및 로그인)를 거의 동시에 수행 할 수 있습니까? 사용자가 계정을 활성화 한 경우 사용자에게 비용을 청구하고 싶지 않습니다. 계정에 로그인 한 경우 (활성화 후)에만 비용을 청구하려고합니다. 그러면 어떻게 든 실제로 할 수 있습니다. "사용자가 활성화 링크를 클릭하고 로그인 한 다음 상태가 ACTIVE로 변경됩니다 (하지만 ACTIVE 상태 인 경우에만 로그인 할 수 있습니다)." 내 문제 설명이 내가 어떤 의견을 보내 주셔서 감사합니다

충분히 명확하지 않은 경우

죄송합니다.

감사합니다. 내가 제대로 귀하의 요구 사항을 이해하면

답변

0

, 당신은 당신의 응용 프로그램에 두 개의 서로 다른 진입 점 (로그인 페이지)를해야합니다 : 아직 활성화되지 않은 사용자를 위해 활성화 (처음 로그인)에 대한

  1. 하나.
  2. 활성 사용자에 대한 또 다른 "정상적인"것.

문제는 인증 로직이 문맥에 민감해야하며 위 페이지 중 어느 것이 인증을 초기화했는지를 알아야한다는 것입니다. 그러나 프레임 워크는 흔하지 않은 사용 사례를 위해 설계되지 않았으므로 인증 공급자는 로그인 양식이 실제로 전송 된 URL에 대해 알지 못합니다. 당신이 해결해야 할 무엇

어떻게 든 (즉 만 비활성 사용자가 URL1에서 로그인 인증 정보에 따라 인증 요청을 처리하는 인증 공급자에 상황에 맞는 정보를 중계하고, 활성 사용자를 인증하는 것입니다 url2에서 로그인). 이를 달성하는 데는 수 백 가지의 다른 방법이있을 수 있습니다. 하나의 가능한 솔루션은 두 개의 서로 다른 URL에 전송 된 인증 요청을 차단하는 두 개의 다른 authenentication 필터를 배치하는 것입니다.

  1. 기존 WebAuthenticationDetailsSourceWebAuthenticationDetails의 사용자 정의 버전을 생성 (바람직하게는 후자를 하위 클래스)이 저장하고 인증 요청의 URI를 노출 : 세부 사항은 아래에 설명. (이는 인증 공급자가 조건부 논리를 구현할 수있는 상황에 기반한 정보입니다.)
  2. UsernamePasswordAuthenticationFilter의 서로 다른 두 인스턴스를 구성하고 필터 체인에 삽입하십시오. filterProcessesUrl 속성을 각각 /j_spring_security_check_active_user/j_spring_security_check_nonactive_user으로 설정하고 위에 만든 사용자 정의 AuthenticationDetailsSource을 모두 삽입하십시오.다음과 같은 방법으로 서브 클래스
  3. 무시 DaoAuthenticationProvider.additionalAuthenticationChecks() :
    • 은 URI가 상기 생성 WebAuthenticationDetails 객체에 저장된 검색 사용자는 URI에 따라 활성/비활성임을
    • 어설 (이것은 authentication.getDetails() 통해 액세스 'S) 어설 션이 실패하면 AccountStatusException을 던집니다.
    • 어설 션이 성공하면 수퍼 클래스에 위임하는 것을 잊지 마십시오.
  4. 는 로그인 양식은 해당 URL ( /j_spring_security_check_nonactive_user/j_spring_security_check_active_user)에 자격 증명을 게시 할 것을 확인, 게시물의 시작 부분에 언급 한 두 개의 서로 다른 로그인 페이지를 만듭니다.
관련 문제