Spring OAuth 过滤器链和 Java 配置

mar*_*amm 5 spring oauth spring-security oauth-2.0

我正在尝试将 spring-security-oauth 添加到具有 spring-security 的现有应用程序中。我正在使用 Java 配置。

我有一个现有的修改过滤器链(添加了一些自定义过滤器),但对“/oauth/token”的请求没有使用它,而是使用“默认”过滤器链。我如何才能访问保护 oauth 端点的过滤器链,以便我也可以在那里使用自定义过滤器,或者我可以将 OAuth 端点连接到现有设置中?

Fen*_*cer 5

确实有一种使用界面更流畅的方式AuthorizationServerConfigurer。您可以坚持注释@EnableAuthorizationServer并在配置文件中实现上述接口。这将使您能够通过执行以下操作来更改 oauth2-filter-chain:

@Configuration
@EnableWebSecurity
@EnableAuthorizationServer
public class SecurityConfig extends WebSecurityConfigurerAdapter 
implements AuthorizationServerConfigurer
    // some configuration ...

    public void configure(AuthorizationServerSecurityConfigurer oauthSecurity) throws Exception {
        oauthSecurity.addTokenEndpointAuthenticationFilter(new YourFilter());
    }

    // more configuration ...
}
Run Code Online (Sandbox Code Playgroud)

与您的addFilterXYX-methods相比,HttpSecurity这里过滤器将位于过滤器链中的位置没有细粒度影响。添加的任何过滤器addTokenEndpointAuthenticationFilter都将插入到BasicAuthenticationFilter.

如果您需要以更详细的方式控制过滤器的位置,您可以创建一个 bean 扩展AuthorizationServerConfigurerAdapter而不是使用注释@EnableAuthorizationServer。我没有尝试过,但我想您可以AuthorizationServerSecurityConfiguration像 systemfreund 建议的那样扩展而无需指定,@Order(-1)因为只有您的自定义配置会被导入。可能您还必须@Import AuthorizationServerEndpointsConfiguration喜欢它是在方便注释中完成的@EnableAuthorizationServer


sys*_*und 2

这可能不是最好的方法,但我没有找到更好的方法。这个想法是提供一个自定义实例并覆盖通过 ed 的AuthorizationServerSecurityConfiguration默认实例。我们只需要确保添加比默认配置优先级更高的注释:@Import@EnableAuthorizationServer@Order

@EnableAuthorizationServer
@Import(CustomSecurityConfig.class)
public class Application {
}

@Configuration
@Order(-1)
public class CustomSecurityConfig extends AuthorizationServerSecurityConfiguration {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http); // do the default configuration first

        http
            .addFilterBefore(new MyFilter(), ...);
    }

}
Run Code Online (Sandbox Code Playgroud)