jwi*_*ner 5 java spring spring-mvc spring-security spring-oauth2
我有一个Spring应用程序 - 而不是 Spring Boot应用程序 - 我正在尝试将API的一部分声明为使用Spring Security保护的OAuth2.当我http在XML中定义元素时,我的授权和一般资源访问配置很有效,但是当我尝试使用ResourceServerConfigureAdapter#configure(HttpSecurity)- 完成@EnableResourceServer等等来实现资源访问块时,该configure方法甚至不会触发(端到端测试也会失败).示例Java配置如下:
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("oauth2/control");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api/**")
.authorizeRequests().anyRequest().hasRole("OAUTH_USER").and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// before=PRE_AUTH_FILTER
.addFilterBefore(oAuth2AuthenticationProcessingFilter, AbstractPreAuthenticatedProcessingFilter.class)
.csrf().disable()
.anonymous().disable()
.exceptionHandling()
.accessDeniedHandler(oAuth2AccessDeniedHandler)
.authenticationEntryPoint(loginUrlAuthenticationEntryPoint);
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试声明了一些影响配置的不同方法,但没有骰子.也就是说,我已经尝试过两个顶级@Configuration类扩展ResourceServerConfigurerAdapter和bean方法返回,ResourceServerConfiguration如Dave Syer的例子 ; 我也试过Ordered.HIGHEST_PRECEDENCE在适当的bean上明确设置顺序.
值得注意的是,大多数应用程序的遗留安全配置都是通过上述XML元素定义的.关于我的配置的另一个可能的红色标志 - 为了让令牌端点对基本的auth client_id进行身份验证:client_secret我必须连接自己的BasicAuthFilter(ProviderManager(DaoAuthProvider(ClientUserDetailsService(clientDetailsService)))))时候,因为它是验证令牌端点的vanilla和'right'方式,我是期望spring config默认为它.
无论如何,在任何情况下我都ResourceServerConfigureAdapter#configure(HttpSecurity)无法开火.我的理论是:
关于前面的XML HTTP块的一些事情阻止了我的
configure方法甚至被调用
这只是一个Spring Boot功能 - 尽管我没有看到这种效果的语言
直上有一个在应用程序上下文对象的一些我失踪(再一次,我在工作的执行注释-除了明显@Configuration和@Bean-是@EnableWebSecurity,@EnableAuthenticationServer和@EnableResourceServer).
我做了一些配置错误(duh).
任何例子都将非常感激
示例OAuth2配置类(几个不同的迭代之一)如下:
@Configuration
@EnableWebSecurity
@EnableResourceServer
public class OAuth2Configuration {
... etc ...
@Bean
public ResourceServerConfiguration adminResources() {
// copped from https://github.com/spring-projects/spring-security-oauth/tree/master/tests/annotation/multi
ResourceServerConfiguration resource = new ResourceServerConfiguration() {
public void setConfigurers(List<ResourceServerConfigurer> configurers) {
super.setConfigurers(configurers);
}
};
resource.setConfigurers(Collections.singletonList(new ResourceServerConfigurerAdapter() {
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("oauth2/control");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api/**")
.authorizeRequests().anyRequest().hasRole("OAUTH_USER").and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// before=PRE_AUTH_FILTER
.addFilterBefore(oAuth2AuthenticationProcessingFilter, AbstractPreAuthenticatedProcessingFilter.class)
.csrf().disable()
.anonymous().disable()
.exceptionHandling()
.accessDeniedHandler(oAuth2AccessDeniedHandler)
.authenticationEntryPoint(loginUrlAuthenticationEntryPoint);
}
}));
resource.setOrder(Ordered.HIGHEST_PRECEDENCE);
return resource;
}
@Configuration
@EnableAuthorizationServer
public static class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
... etc ...
}
}
Run Code Online (Sandbox Code Playgroud)
Analogogous <http>这个配置被拾起:
<sec:http pattern="/api/**" create-session="stateless"
entry-point-ref="loginUrlAuthenticationEntryPoint">
<sec:anonymous enabled="false" />
<sec:csrf disabled="true"/> <!-- csrf tokens don't make sense for a 3rd party API -->
<sec:custom-filter ref="oauth2ProcessingFilter" before="PRE_AUTH_FILTER"/>
<sec:access-denied-handler ref="oauthAccessDeniedHandler" />
<sec:intercept-url pattern="/api/**" access="hasRole('OAUTH_USER')" />
</sec:http>
Run Code Online (Sandbox Code Playgroud)
如果您同时使用基于 Java 和基于 XML 的安全配置,则只会选择基于 XML 的安全配置。您是否尝试过禁用/注释掉所有基于 XML 的 http 安全配置并查看基于 Java 的安全配置是否会激活?
我以前也遇到过类似的问题。我在 Spring Security Gitter 频道寻求帮助并做了一些调查。见下文:
| 归档时间: |
|
| 查看次数: |
640 次 |
| 最近记录: |