Spring Security 검증 프로 세 스 분석 및 사용자 정의 검증 방법

Spring Security 의 본질
Spring Security 는 본질 적 으로 일련의 Filter 이 고 독립 된 Filter Chain 에 삽입 되 며 FilterChain Proxy 라 고 합 니 다.그림 에서 보 듯 이.
 
실제로 FilterChain Proxy 아래 에는 여러 개의 Filter Chain 이 있어 서로 다른 URL 을 검증 할 수 있 으 며,Filter Chain 에 있 는 Filter 는 정 의 된 서비스 에 따라 자동 으로 증감 된다.따라서 자신의 논 리 를 실현 하려 고 하지 않 는 한 필터 들 을 표시 하고 정의 할 필요 가 없다.
 
관건 류
Authentication
Authentication 은 사용자 인증 정 보 를 나타 내 는 인터페이스 로 사용자 가 인증 에 로그 인하 기 전에 관련 정 보 는 Authentication 의 구체 적 인 실현 클래스 의 대상 으로 봉 인 됩 니 다.로그 인 인증 에 성공 한 후에 더욱 전면적 이 고 사용자 권한 등 정 보 를 포함 한 Authentication 대상 을 생 성 합 니 다.그리고 이 를 Security ContextHolder 가 가지 고 있 는 Security Context 에 저장 하여 방문 권한 의 감정 등 후속 프로그램 에서 호출 할 수 있 도록 합 니 다.
AuthenticationManager
인증 을 위 한 가장 중요 한 인 터 페 이 스 는 AuthenticationManager 입 니 다.이 인 터 페 이 스 는 한 가지 방법 만 있 습 니 다.

public interface AuthenticationManager {
 Authentication authenticate(Authentication authentication)
 throws AuthenticationException;
}
그 중에서 authenticate()방법 이 실 행 된 후에 세 가지 상황 이 있 을 수 있 습 니 다.
인증 에 성공 하여 사용자 정보 가 있 는 Authentication 을 되 돌려 줍 니 다.
인증 에 실 패 했 습 니 다.AuthenticationException 이상 을 던 집 니 다.
판단 할 수 없습니다.null 로 돌아 갑 니 다.
ProviderManager
Provider Manager 는 위의 AuthenticationManager 에서 가장 흔히 볼 수 있 는 실현 입 니 다.인증 을 직접 처리 하지 않 고 설 정 된 AuthenticationProvider 목록 에 인증 을 의뢰 한 다음 에 모든 AuthenticationProvider 를 순서대로 호출 하여 인증 합 니 다.이 과정 에서 AuthenticationProvider 인증 이 성공 하면 더 이상 검증 을 하지 않 습 니 다.이 인증 결 과 를 Provider Manager 의 인증 결과 로 직접 사용 합 니 다.
 
인증 과정
사용 자 는 사용자 이름과 비밀 번 호 를 사용 하여 로그 인 합 니 다.
Spring Security 는 자주 사용 하 는 UsernamePassword Authentication Token 과 같은 사용자 이름과 비밀 번 호 를 Authentication 인터페이스의 실현 클래스 로 봉 합 니 다.
위 에서 발생 한 Authentication 대상 을 AuthenticationManager 의 실현 클래스 Provider Manager 에 전달 하여 인증 합 니 다.
Provider Manager 는 각 AuthenticationProvider 를 차례로 호출 하여 인증 을 하고 인증 에 성공 한 후 사용자 권한 등 정 보 를 봉 인 된 Authentication 대상 을 되 돌려 줍 니 다.
AuthenticationManager 가 되 돌아 오 는 Authentication 대상 을 현재 Security Context 에 부여 합 니 다.
사용자 정의 인증
이상 의 지식 비축 이 있 으 면 검증 방법 을 정의 할 수 있다.위 를 통 해 알 수 있 듯 이 실제 검증 작업 을 하 는 것 은 하나의 AuthenticationProvider 입 니 다.따라서 인증 방법 을 사용자 정의 하려 면 하나의 AuthenticationProvider 를 실현 한 다음 Provider Manager 에 추가 하면 됩 니 다.
사용자 정의 인증 공급 자

@Component
public class CustomAuthenticationProvider
 implements AuthenticationProvider {
 @Override
 public Authentication authenticate(Authentication authentication) 
 throws AuthenticationException {
 String name = authentication.getName();
 String password = authentication.getCredentials().toString();
 if (shouldAuthenticateAgainstThirdPartySystem()) {
  // use the credentials
  // and authenticate against the third-party system
  return new UsernamePasswordAuthenticationToken(
  name, password, new ArrayList<>());
 } else {
  return null;
 }
 }
 @Override
 public boolean supports(Class<?> authentication) {
 return authentication.equals(
  UsernamePasswordAuthenticationToken.class);
 }
}
그 중의 슈퍼 ports()방법 은 authentication 인 자 를 받 아들 여 들 어 오 는 authentication 이 AuthenticationProvider 가 처리 할 수 있 는 유형 인지 판단 합 니 다.
등록 인증 공급 자
이제 새로 만 든 AuthenticationProvider 를 Provider Manager 에 등록 하면 모든 작업 이 완 료 됩 니 다.

@Configuration
@EnableWebSecurity
@ComponentScan("org.baeldung.security")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 @Autowired
 private CustomAuthenticationProvider authProvider;
 @Override
 protected void configure(
 AuthenticationManagerBuilder auth) throws Exception {
 auth.authenticationProvider(authProvider);
 }
 @Override
 protected void configure(HttpSecurity http) throws Exception {
 http.authorizeRequests().anyRequest().authenticated()
  .and()
  .httpBasic();
 }
}
총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 Spring Security 검증 절차 에 대한 분석 과 사용자 정의 검증 방법 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기