acegi 인증 프로세스

3935 단어 DAOcacheAcegi
AuthenticationManager는 클라이언트 입력자 사용자 이름이 정확한지 확인하는 인증 코어 인터페이스입니다.
이 인터페이스는 방법이 하나밖에 없어요.
public Authentication authenticate(Authentication authentication)
        throws AuthenticationException;

이 방법은 바로 사용자 이름 비밀번호를 검증할 때 정확하다는 것이다. 그러면 사용자 이름 비밀번호는 어디에 있습니까?Authentication 클래스에 봉인되어 있습니다. 이렇게 하면 authenticate () 방법에서 사용자 이름 비밀번호를 얻어서 검증할 수 있습니다.
사용자 이름 비밀번호를 검증하는 방식은 Dao 검증ldap 검증과 같이 Authentication Provider라고 불리는데 이런provider는 검증이 통과되기만 하면 검증이 성공했다고 여긴다.(다른 곳에서 본 미검증)
Authentication Manager에는 이러한 provider를 관리하는 하위 클래스 Provider Manager가 있습니다.
모든 provider를 순환 방식으로 실행합니다
while (iter.hasNext()) {
            AuthenticationProvider provider = (AuthenticationProvider) iter.next();

            if (provider.supports(toTest)) {
                logger.debug("Authentication attempt using " + provider.getClass().getName());

                Authentication result = null;

                try {
                    result = provider.authenticate(authentication);
                    sessionController.checkAuthenticationAllowed(result);
                } catch (AuthenticationException ae) {
                    lastException = ae;
                    result = null;
                }

                if (result != null) {
                    sessionController.registerSuccessfulAuthentication(result);
                    publishEvent(new AuthenticationSuccessEvent(result));

                    return result;
                }
            }
        }

순환이 끝난 후 인증이 끝난 후에 Authentication 실례가 되돌아왔습니다. 이 Authentication 실례는 매개 변수로 전송된 실례와 무엇이 다릅니까?
아래 코드를 보세요.
public final Authentication authenticate(Authentication authRequest)
        throws AuthenticationException {
        try {
            Authentication authResult = doAuthentication(authRequest);
            copyDetails(authRequest, authResult);

            return authResult;
        } catch (AuthenticationException e) {
            e.setAuthentication(authRequest);
            throw e;
        }
    }

이 코드는 두 개의authResult와authRequest의 차이를 볼 수 없습니다
아래 코드를 보세요.
protected Authentication createSuccessAuthentication(Object principal, Authentication authentication,
        UserDetails user) {
        // Ensure we return the original credentials the user supplied,
        // so subsequent attempts are successful even with encoded passwords.
        // Also ensure we return the original getDetails(), so that future
        // authentication events after cache expiry contain the details
        UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(principal,
                authentication.getCredentials(), user.getAuthorities());
        result.setDetails(authentication.getDetails());

        return result;
    }

Credentials가 다시 결과의 일부로 되돌아오는 것을 볼 수 있습니다.
user.getauthorities는 사용자의 권한을 얻는 것입니다
principal 봉인 사용자 이름 이메일 등 사용자 정보
주의해야 할 것은 이 문장은 전송된details 데이터를 결과의 일부분으로 되돌려준다
result.setDetails(authentication.getDetails());
그리고
copyDetails(authRequest, authResult);
 private void copyDetails(Authentication source, Authentication dest) {
        if ((dest instanceof AbstractAuthenticationToken) && (dest.getDetails() == null)) {
            AbstractAuthenticationToken token = (AbstractAuthenticationToken) dest;

            token.setDetails(source.getDetails());
        }
    }

매개 변수의details가 결과에 다시 설정되어 되돌아옵니다. 만약 검증 과정에서details가 바뀌지 않았다면...
이 details는 도대체 무엇에 쓰는 것입니까?오늘은 여기까지 쓰고 내일 다시 연구하자

좋은 웹페이지 즐겨찾기