Spring 安全 OAuth Java 配置
Spring Security OAuth Java Config
我有一个 Spring 应用程序 -- 不是 一个 Spring 引导应用程序 -- 我正在尝试声明 API 作为 OAuth2 使用 Spring 安全保护。当我在 XML 中定义 http
元素时,我的授权和一般资源访问配置工作得很好,但是当我尝试使用 ResourceServerConfigureAdapter#configure(HttpSecurity)
实现资源访问块时——用 [=17= 完成] 等,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);
}
我尝试过声明几种不同的方式来影响配置,但没有成功。也就是说,我已经尝试了扩展 ResourceServerConfigurerAdapter
的顶级 @Configuration
classes 和 Dave Syer's example 中返回 ResourceServerConfiguration
的 bean 方法;我还尝试在适当的 bean 上明确地将 order 设置为 Ordered.HIGHEST_PRECEDENCE
。
很可能需要注意的是,大多数应用程序的遗留安全配置都是通过 XML 元素定义的,如上所示。关于我的配置的另一个可能的危险信号——为了让令牌端点根据基本身份验证 client_id:client_secret 进行身份验证,我不得不连接我自己的 BasicAuthFilter(ProviderManager(DaoAuthProvider(ClientUserDetailsService(clientDetailsService)))))
,因为它是香草和 'right' 方式为了验证令牌端点,我希望 spring 配置只是默认使用它。
无论如何,在任何情况下我都无法ResourceServerConfigureAdapter#configure(HttpSecurity)
开火。我的理论是:
关于前面的 XML HTTP 块的一些事情阻止了我
configure
方法甚至被调用
这只是一个 Spring 仅用于引导的功能——尽管我没有看到具有这种效果的语言
我在应用程序上下文中直接遗漏了一些对象(同样,我在工作中使用的操作注释——除了明显的 @Configuration
和 @Bean
-- 是 @EnableWebSecurity
、@EnableAuthenticationServer
和 @EnableResourceServer
).
我犯了一些配置错误(呃)。
任何例子将不胜感激
示例 OAuth2 配置 class(几个不同的迭代之一)如下:
@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 ...
}
}
是的类似<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>
如果您同时使用基于 Java 和基于 XML 的安全配置,则只会选择基于 XML 的安全配置。您是否尝试过 disabling/commenting-out 所有基于 XML 的 http 安全配置并查看基于 Java 的 http 安全配置是否会激活?
我之前遇到过类似的问题。我在 Spring Security Gitter 频道寻求帮助,也做了一些调查。见下文:
我有一个 Spring 应用程序 -- 不是 一个 Spring 引导应用程序 -- 我正在尝试声明 API 作为 OAuth2 使用 Spring 安全保护。当我在 XML 中定义 http
元素时,我的授权和一般资源访问配置工作得很好,但是当我尝试使用 ResourceServerConfigureAdapter#configure(HttpSecurity)
实现资源访问块时——用 [=17= 完成] 等,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);
}
我尝试过声明几种不同的方式来影响配置,但没有成功。也就是说,我已经尝试了扩展 ResourceServerConfigurerAdapter
的顶级 @Configuration
classes 和 Dave Syer's example 中返回 ResourceServerConfiguration
的 bean 方法;我还尝试在适当的 bean 上明确地将 order 设置为 Ordered.HIGHEST_PRECEDENCE
。
很可能需要注意的是,大多数应用程序的遗留安全配置都是通过 XML 元素定义的,如上所示。关于我的配置的另一个可能的危险信号——为了让令牌端点根据基本身份验证 client_id:client_secret 进行身份验证,我不得不连接我自己的 BasicAuthFilter(ProviderManager(DaoAuthProvider(ClientUserDetailsService(clientDetailsService)))))
,因为它是香草和 'right' 方式为了验证令牌端点,我希望 spring 配置只是默认使用它。
无论如何,在任何情况下我都无法ResourceServerConfigureAdapter#configure(HttpSecurity)
开火。我的理论是:
关于前面的 XML HTTP 块的一些事情阻止了我
configure
方法甚至被调用这只是一个 Spring 仅用于引导的功能——尽管我没有看到具有这种效果的语言
我在应用程序上下文中直接遗漏了一些对象(同样,我在工作中使用的操作注释——除了明显的
@Configuration
和@Bean
-- 是@EnableWebSecurity
、@EnableAuthenticationServer
和@EnableResourceServer
).我犯了一些配置错误(呃)。
任何例子将不胜感激
示例 OAuth2 配置 class(几个不同的迭代之一)如下:
@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 ...
}
}
是的类似<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>
如果您同时使用基于 Java 和基于 XML 的安全配置,则只会选择基于 XML 的安全配置。您是否尝试过 disabling/commenting-out 所有基于 XML 的 http 安全配置并查看基于 Java 的 http 安全配置是否会激活?
我之前遇到过类似的问题。我在 Spring Security Gitter 频道寻求帮助,也做了一些调查。见下文: