[SPRING] 동일한 애플리케이션에서 스프링 보안 양식 로그인 및 oauth2
SPRING동일한 애플리케이션에서 스프링 보안 양식 로그인 및 oauth2
spring-security-oauth2를 사용하여 보호 된 일부 휴식 서비스가있는 샘플 스프링 응용 프로그램을 작성했습니다. 이제이 서비스를 스프링 보안 양식 로그인을 사용하는 원래 응용 프로그램으로 이동하려고합니다.
원래 응용 프로그램에서는 rest-service가 form-login을 사용하여 보호되도록 spring-security-oauth2 및 다른 스프링 컨트롤러로부터 보호되기를 원합니다. 제가 알고 싶은 것은이 접근법이 옳은지, 틀린 것인지, 만약 그렇다면 어떻게하면이 행동을 완료 할 수 있는지입니다.
oauth2를 사용하는 샘플 앱 코드입니다.
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService userDetailsService; // Is this really needed?
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
@Configuration
public class OAuth2ServerConfiguration {
private static final String RESOURCE_ID = "restservice";
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
// @formatter:off
resources.resourceId(RESOURCE_ID);
// @formatter:on
}
@Override
public void configure(HttpSecurity http) throws Exception {
// http.authorizeRequests().antMatchers("/test").not().permitAll();
http.authorizeRequests().antMatchers("/test").authenticated();
}
}
@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
private TokenStore tokenStore = new InMemoryTokenStore();
@Autowired
// @Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
// @formatter:off
endpoints.tokenStore(this.tokenStore).authenticationManager(this.authenticationManager);
// @formatter:on
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
// @formatter:off
clients.inMemory().withClient("clientapp").authorizedGrantTypes("password", "refresh_token").authorities("USER")
.scopes("read", "write").resourceIds(RESOURCE_ID).secret("123456");
// @formatter:on
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices tokenServices = new DefaultTokenServices();
tokenServices.setSupportRefreshToken(true);
tokenServices.setTokenStore(this.tokenStore);
return tokenServices;
}
}
}
다음은 원래 앱 구성의 일부입니다.
@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MyStaysureSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder.inMemoryAuthentication().withUser("mycompany").password("mypsswd").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/rest/*", "/api-docs/**").permitAll().antMatchers("/**").authenticated().and().formLogin().defaultSuccessUrl("/dashboard").and().csrf().disable();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
해결법
-
==============================
1.스프링 시큐리티는 필터 체인의 정렬 된 목록을 기반으로하며 각 요청에 대해 일치하는 경로가있는 첫 번째 인증서가 인증을 처리합니다. @EnableAuthorizationServer (기본 주문 = 0), @EnableResourceServer (기본 주문 = 3) 및 MyStaysureSecurityConfiguration (주문 = 0)로 만든 필터 체인이 3 개 있습니다. 동일한 순서로 2 개의 필터를 가질 수 없으므로 다시 정렬해야하며 사용 사례에 맞는 요청 matchers를 제공해야합니다. 어쨌든 @EnableAuthorizationServer가 필요하지 않은 것 같습니다 (질문에서 명확하지 않았습니다). 어쨌든 그것은 매우 간단합니다 - 당신은 2 가지 선택을합니다 (대략적으로) :
스프링 시큐리티는 필터 체인의 정렬 된 목록을 기반으로하며 각 요청에 대해 일치하는 경로가있는 첫 번째 인증서가 인증을 처리합니다. @EnableAuthorizationServer (기본 주문 = 0), @EnableResourceServer (기본 주문 = 3) 및 MyStaysureSecurityConfiguration (주문 = 0)로 만든 필터 체인이 3 개 있습니다. 동일한 순서로 2 개의 필터를 가질 수 없으므로 다시 정렬해야하며 사용 사례에 맞는 요청 matchers를 제공해야합니다. 어쨌든 @EnableAuthorizationServer가 필요하지 않은 것 같습니다 (질문에서 명확하지 않았습니다). 어쨌든 그것은 매우 간단합니다 - 당신은 2 가지 선택을합니다 (대략적으로) :
from https://stackoverflow.com/questions/29893602/spring-security-form-logging-and-outh2-in-same-app by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring-Batch에서 ItemReader로 라인을 건너 뛰는 방법? (0) | 2019.05.05 |
---|---|
[SPRING] Spring Data로 특정 항목을 볼 때만 특정 필드를 노출합니까? (0) | 2019.05.05 |
[SPRING] 최대 절전 모드에서 예외를 throw하지 않는 DB 제약 위반 (0) | 2019.05.04 |
[SPRING] spring-data-couchbase를 사용하고 있지만 메서드 이름의 쿼리 작성이 작동하지 않습니다. (0) | 2019.05.04 |
[SPRING] Spring Batch로 여러 열의 CSV 파일을 읽는 법 (0) | 2019.05.04 |