acegi 인증 프로세스
이 인터페이스는 방법이 하나밖에 없어요.
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는 도대체 무엇에 쓰는 것입니까?오늘은 여기까지 쓰고 내일 다시 연구하자
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring에서 DAO가 순환 호출될 때 데이터가 실시간으로 업데이트되지 않는 해결 방법문제를 설명하기 전에 몇 가지 전제 사항을 설명하십시오. Spring의 구성 파일에서 다음과 같은 방식으로 데이터베이스 트랜잭션을 구성했다고 가정하십시오. 현재 UserDao 및 Security Service가 있습...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.