我尝试使用spring-security将spring-security-oauth添加到现有应用中。我正在使用Java配置。
我已经修改了现有的过滤器链(添加了一些自定义过滤器),但是请求' / oauth / token'没有使用它,但正在使用'默认'过滤链。如何才能访问保护oauth端点的过滤器链,以便我可以在那里使用自定义过滤器,还是可以将OAuth端点连接到现有设置中?
答案 0 :(得分:3)
使用界面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 ...
}
与addFilterXYX
- HttpSecurity
的方法相比,您在此处没有细粒度的影响,其中过滤器将位于过滤器链中。由addTokenEndpointAuthenticationFilter
添加的所有过滤器都将插入BasicAuthenticationFilter
。
如果您需要以更详细的方式控制过滤器的位置,则可以创建一个扩展AuthorizationServerConfigurerAdapter
而不是使用注释@EnableAuthorizationServer
的bean。我没有尝试,但我想你可以扩展AuthorizationServerSecurityConfiguration
像systemfreund建议,而不必指定@Order(-1)
因为只导入自定义配置。您可能还需要@Import
AuthorizationServerEndpointsConfiguration
,就像在便捷注释@EnableAuthorizationServer
中完成一样。
答案 1 :(得分:2)
这可能不是最好的方法,但我没有找到更好的方法。我们的想法是提供自定义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(), ...);
}
}