Yan*_*lem 7 java spring spring-security spring-boot spring-security-oauth2
我有有一个应用程序@EnableOAuth2Sso上的WebSecurityConfigurerAdapter 
添加@EnableOAuth2Sso应用程序后,将我重定向到授权服务器,并允许在此授权服务器登录后进行访问.我也想提供API访问,所以我希望应用程序能够通过Authorization-Header传递一个accessstoken来访问我的资源
Authorization: bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9... 
我通过认证过滤器进行了调试,该过滤器与notice一起使用,@EnableOAuth2Sso未检查Authorization-Header值.
之后我尝试创建自定义过滤器并将此过滤器添加到安全配置中
@Override
public void configure(HttpSecurity http) throws Exception {
  http.addFilter(myCustomFilter)
    ...;
}
但现在我得到以下例外:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is org.springframework.security.config.annotation.AlreadyBuiltException: This object has already been built
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
    ... 26 more
Caused by: org.springframework.security.config.annotation.AlreadyBuiltException: This object has already been built
    at org.springframework.security.config.annotation.AbstractSecurityBuilder.build(AbstractSecurityBuilder.java:44)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain(WebSecurityConfiguration.java:105)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$f0788cea.CGLIB$springSecurityFilterChain$5(<generated>)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$f0788cea$$FastClassBySpringCGLIB$$7e95689d.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:318)
    at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$$EnhancerBySpringCGLIB$$f0788cea.springSecurityFilterChain(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
起初我以为我在我的过滤器中做了一些错误但我最终得到了一个简单的过滤器类除了继续过滤链并且仍然有相同的错误.
所以我有两个问题:
@EnableOAuth2Sso?Yan*_*lem 10
异常的原因是像@jah这样的过滤器的排序.
我在Authorization-Header中实现包含访问令牌的请求身份验证所做的是创建一个ApiTokenAccessFilter扩展的类OAuth2AuthenticationProcessingFilter.此过滤器采用ResourceServerTokenServices构造函数参数并将无状态标志设置为false.
public class ApiTokenAccessFilter extends OAuth2AuthenticationProcessingFilter {
  public ApiTokenAccessFilter(ResourceServerTokenServices resourceServerTokenServices) {
    super();
    setStateless(false);
    setAuthenticationManager(oauthAuthenticationManager(resourceServerTokenServices));
  }
  private AuthenticationManager oauthAuthenticationManager(ResourceServerTokenServices tokenServices) {
    OAuth2AuthenticationManager oauthAuthenticationManager = new OAuth2AuthenticationManager();
    oauthAuthenticationManager.setResourceId("oauth2-resource");
    oauthAuthenticationManager.setTokenServices(tokenServices);
    oauthAuthenticationManager.setClientDetailsService(null);
    return oauthAuthenticationManager;
  }
}
在我的安全配置中,我使用此过滤器如下:
@Configuration
@EnableOAuth2Sso
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
  @Autowired
  private ResourceServerTokenServices tokenServices;
  @Override
  public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
        .addFilterBefore(new ApiTokenAccessFilter(tokenServices), AbstractPreAuthenticatedProcessingFilter.class);
  }
}
我认为这可能会更容易,所以我在spring-security-oauth Github repo上打开了一个问题.我不确定这种解决方案是否可行,但我没有找到另一种选择.
| 归档时间: | 
 | 
| 查看次数: | 6532 次 | 
| 最近记录: |