【发布时间】:2017-09-15 17:05:28
【问题描述】:
我有一个在WebSecurityConfigurerAdapter 上有@EnableOAuth2Sso 的应用程序
添加@EnableOAuth2Sso后,应用程序将我重定向到授权服务器,并允许在此授权服务器上登录后访问。我也想提供 API 访问权限,所以我希望应用程序能够通过 Authorization-Header 传递访问令牌来访问我的资源
Authorization: bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
我通过与@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的应用程序中对端点进行令牌身份验证?
【问题讨论】:
-
我猜你的意思是 @EnableOAuth2Sso 而不是 @EnableSso ?您能否详细说明“重定向工作正常”和“也带有不记名令牌的授权标头”
-
是的,你是对的。我修正了错别字并试图更好地解释我想要实现的目标。
标签: java spring spring-security spring-boot spring-security-oauth2