将OAuth2添加到现有的Spring Security App

时间:2016-03-11 16:58:22

标签: spring spring-security spring-security-oauth2

我有一个使用以下配置运行的Web应用程序。

public class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            http
            .antMatcher("/api/**")
            .authorizeRequests()
                .antMatchers("/api/open/**").permitAll()
                .antMatchers("/api/data/**").authenticated()
                .antMatchers("/api/user/**").hasRole("USER")
                .antMatchers("/api/mgr/**").hasRole("MGR")
                .antMatchers("/api/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            .and()              .exceptionHandling().accessDeniedHandler(customBasicAuthenticationAccessDeniedHandler())
            .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
                .csrf().disable() //TODO
                .httpBasic().authenticationEntryPoint(customBasicAuthenticationEntryPoint());
        }
...
}

然后我补充说,

@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
   ...
}

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    //Same as WebSecurityConfigurerAdapter configure()
    ...
}

由于ResourceServerConfig类,现在一切都已经解决了。尝试了各种方法来配置它。但似乎ResourceServerConfigurerAdapter的行为与WebSecurityConfigurerAdapter完全不同,但我没有一条线索可以让它发挥作用。

我是否需要删除WebSecurityConfigurerAdapter并仅保留ResourceServerConfigurerAdapter?是的,但是配置(HttpSecurity)的行为与我想的不同。

还建议使用一些stackoverflow答案来更改WebSecurityConfigurerAdapter的@Order。但没有任何作用。

我首先需要知道什么是错的,什么是正确的,而不是编写代码。

如果有人指出了正确的方向,我会非常感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

通过分享这一点,我只是想提供帮助,而不是回答您的问题。我知道文档不是那么好。只需分享我的2美分。

这对我有用。使用Spring-security-Oauth2版本2.0.7

@EnableWebSecurity
public class SampleMultiHttpSecurityConfig {

@Configuration
    @Order(1)
    public static class ComplexOauth2SpringSecurityConfiguration extends
            WebSecurityConfigurerAdapter {

    @Autowired
    private OAuth2AuthenticationProcessingFilter oAuth2AuthenticationProcessingFilter;


    @Autowired
    private OAuth2AuthenticationManager oAuth2AuthenticationManager;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    ...
    }
}

@Configuration
public static class ComplexOauth2SpringSecurityConfiguration2 extends
        WebSecurityConfigurerAdapter {

    @Autowired
    private OAuth2AuthenticationProcessingFilter oAuth2AuthenticationProcessingFilter;


    @Autowired
    private OAuth2AuthenticationManager oAuth2AuthenticationManager;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    ...
    }
}

此后,我只是添加了一个组件:扫描具有此类的包。

这主要是在服务器端。 另请注意注入OAuth2AuthenticationProcessingFilter。这基于RemoteTokenServices,其中一项工作是使用授权服务器执行令牌验证。

<bean id="remoteTokenServices" class="org.springframework.security.oauth2.provider.token.RemoteTokenServices"
        init-method="init" destroy-method="shutdown">
    <property name="checkTokenEndpointUrl" value"..."/>
</bean>

我确实同意我没有实现资源服务器和授权服务器。它们已经为我们建造了。但是,在测试时,我们只是创建了几个REST POST服务来模拟令牌生成和验证。