1. 개요
이 예제에서는 간단한 UserDetailsService 를 사용하는 표준 시나리오와 비교하여 추가 유연성을 허용하는 Spring Security에서 인증 공급자 를 설정하는 방법을 배웁니다 .
2. 인증 공급자
Spring Security는 인증을 수행하기 위한 다양한 옵션을 제공합니다. 이러한 옵션은 간단한 계약을 따릅니다. 인증 요청은 AuthenticationProvider에 의해 처리되고 전체 자격 증명이 있는 완전히 인증된 개체가 반환됩니다.
가장 일반적인 표준 구현은 간단한 읽기 전용 사용자 DAO인 UserDetailsService 에서 사용자 세부 정보를 검색하는 DaoAuthenticationProvider 입니다. 이 사용자 세부 정보 서비스 는 대부분의 시나리오에 충분한 전체 사용자 엔터티를 검색하기 위해 사용자 이름에만 액세스할 수 있습니다.
더 많은 사용자 지정 시나리오는 인증 프로세스를 수행할 수 있도록 전체 인증 요청에 액세스해야 합니다. 예를 들어 일부 외부 타사 서비스(예: Crowd )에 대해 인증할 때 인증 요청 의 사용자 이름 과 비밀번호 가 모두 필요 합니다.
이러한 고급 시나리오 의 경우 사용자 지정 인증 공급자를 정의 해야 합니다 .
@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);
}
}
반환된 인증 개체에 설정된 부여된 권한이 비어 있음에 유의하십시오 . 물론 권한은 응용 프로그램별로 다르기 때문입니다.
3. 인증 공급자 등록
이제 인증 공급자를 정의했으므로 사용 가능한 네임스페이스 지원을 사용하여 XML Security 구성에서 이를 지정해야 합니다.
<http use-expressions="true">
<intercept-url pattern="/**" access="isAuthenticated()"/>
<http-basic/>
</http>
<authentication-manager>
<authentication-provider
ref="customAuthenticationProvider" />
</authentication-manager>
4. 자바 구성
다음으로 해당 Java 구성을 살펴보겠습니다.
@Configuration
@EnableWebSecurity
@ComponentScan("com.baeldung.security")
public class SecurityConfig {
@Autowired
private CustomAuthenticationProvider authProvider;
@Bean
public AuthenticationManager authManager(HttpSecurity http) throws Exception {
AuthenticationManagerBuilder authenticationManagerBuilder =
http.getSharedObject(AuthenticationManagerBuilder.class);
authenticationManagerBuilder.authenticationProvider(authProvider);
return authenticationManagerBuilder.build();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic();
return http.build();
}
}
5. 인증 수행
클라이언트에서 인증을 요청하는 것은 기본적으로 백엔드에서 이 사용자 지정 인증 공급자를 사용하거나 사용하지 않고 동일합니다.
간단한 curl 명령을 사용하여 인증된 요청을 보냅니다.
curl --header "Accept:application/json" -i --user user1:user1Pass
http://localhost:8080/spring-security-custom/api/foo/1
이 예제의 목적을 위해 기본 인증으로 REST API를 보호했습니다.
그리고 서버에서 예상되는 200 OK를 반환합니다.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=B8F0EFA81B78DE968088EBB9AFD85A60; Path=/spring-security-custom/; HttpOnly
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 02 Jun 2013 17:50:40 GMT
6. 결론
이 기사에서는 Spring Security에 대한 사용자 정의 인증 공급자의 예를 살펴보았습니다.
이 문서의 전체 구현은 GitHub 프로젝트 에서 찾을 수 있습니다 .