복붙노트

[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. ==============================

    1.스프링 시큐리티는 필터 체인의 정렬 된 목록을 기반으로하며 각 요청에 대해 일치하는 경로가있는 첫 번째 인증서가 인증을 처리합니다. @EnableAuthorizationServer (기본 주문 = 0), @EnableResourceServer (기본 주문 = 3) 및 MyStaysureSecurityConfiguration (주문 = 0)로 만든 필터 체인이 3 개 있습니다. 동일한 순서로 2 개의 필터를 가질 수 없으므로 다시 정렬해야하며 사용 사례에 맞는 요청 matchers를 제공해야합니다. 어쨌든 @EnableAuthorizationServer가 필요하지 않은 것 같습니다 (질문에서 명확하지 않았습니다). 어쨌든 그것은 매우 간단합니다 - 당신은 2 가지 선택을합니다 (대략적으로) :

    스프링 시큐리티는 필터 체인의 정렬 된 목록을 기반으로하며 각 요청에 대해 일치하는 경로가있는 첫 번째 인증서가 인증을 처리합니다. @EnableAuthorizationServer (기본 주문 = 0), @EnableResourceServer (기본 주문 = 3) 및 MyStaysureSecurityConfiguration (주문 = 0)로 만든 필터 체인이 3 개 있습니다. 동일한 순서로 2 개의 필터를 가질 수 없으므로 다시 정렬해야하며 사용 사례에 맞는 요청 matchers를 제공해야합니다. 어쨌든 @EnableAuthorizationServer가 필요하지 않은 것 같습니다 (질문에서 명확하지 않았습니다). 어쨌든 그것은 매우 간단합니다 - 당신은 2 가지 선택을합니다 (대략적으로) :

  2. from https://stackoverflow.com/questions/29893602/spring-security-form-logging-and-outh2-in-same-app by cc-by-sa and MIT license