Spring extractAuthentication 上的 Oauth2 RemoteTokenServices 错误
Spring Oauth2 RemoteTokenServices error on extractAuthentication
我有一个资源服务器和一个授权服务器。
根据资源请求,它会在 /oauth/check_token
端点上使用身份验证服务器验证接收到的 access_token。这给出了使我的请求崩溃的响应。
响应发送为:
Written [{exp=1433335640, scope=[read, write], authorities=[ROLE_USER], client_id=client-w-s}] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@58a88f5a]
当我的资源服务器收到它时:
2015-06-03 14:17:48.277 DEBUG 9492 --- [nio-8181-exec-3] o.s.web.client.RestTemplate : POST request for "http://localhost:6707/oauth/check_token" resulted in 200 (OK)
2015-06-03 14:17:48.277 DEBUG 9492 --- [nio-8181-exec-3] o.s.web.client.RestTemplate : Reading [interface java.util.Map] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@67409450]
2015-06-03 14:17:48.283 ERROR 9492 --- [nio-8181-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
java.lang.ArrayStoreException: null
at java.util.ArrayList.toArray(Unknown Source)
at org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter.extractAuthentication(DefaultAccessTokenConverter.java:139)
这是它失败的代码片段:
Collection<? extends GrantedAuthority> authorities = null;
if (user==null && map.containsKey(AUTHORITIES)) {
@SuppressWarnings("unchecked")
String[] roles = ((Collection<String>)map.get(AUTHORITIES)).toArray(new String[0]);
authorities = AuthorityUtils.createAuthorityList(roles);
}
我 运行 在调试模式下检查 map
中的值,从我的授权服务器建立的响应来看,一切看起来都应该是这样。
如果我需要post更多信息,请告诉我。
有没有人遇到过这个问题或者知道如何解决这个问题?
我找到了"solution"。
我的 pom 文件版本不匹配。虽然我的身份验证服务器是 运行 spring-security-oauth2-2.0.5.RELEASE
我的资源服务器是 运行 spring-security-oauth2-2.0.7.RELEASE
.
版本声明响应不同。
我认为 DefaultAccessTokenConverter 的实现有一个错误,因为 spring-security-oauth2 2.0.7.RELEASE,因为这一行:
if (user==null && map.containsKey(AUTHORITIES)) {
...
}
为什么会出现“user==null”条件?
"user" 变量不为空,因此条件永远不会为真,并且 authorities 数组未填充。
我认为这是一个 Spring 安全 Oauth2 实施错误。
我有一个资源服务器和一个授权服务器。
根据资源请求,它会在 /oauth/check_token
端点上使用身份验证服务器验证接收到的 access_token。这给出了使我的请求崩溃的响应。
响应发送为:
Written [{exp=1433335640, scope=[read, write], authorities=[ROLE_USER], client_id=client-w-s}] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@58a88f5a]
当我的资源服务器收到它时:
2015-06-03 14:17:48.277 DEBUG 9492 --- [nio-8181-exec-3] o.s.web.client.RestTemplate : POST request for "http://localhost:6707/oauth/check_token" resulted in 200 (OK)
2015-06-03 14:17:48.277 DEBUG 9492 --- [nio-8181-exec-3] o.s.web.client.RestTemplate : Reading [interface java.util.Map] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@67409450]
2015-06-03 14:17:48.283 ERROR 9492 --- [nio-8181-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
java.lang.ArrayStoreException: null
at java.util.ArrayList.toArray(Unknown Source)
at org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter.extractAuthentication(DefaultAccessTokenConverter.java:139)
这是它失败的代码片段:
Collection<? extends GrantedAuthority> authorities = null;
if (user==null && map.containsKey(AUTHORITIES)) {
@SuppressWarnings("unchecked")
String[] roles = ((Collection<String>)map.get(AUTHORITIES)).toArray(new String[0]);
authorities = AuthorityUtils.createAuthorityList(roles);
}
我 运行 在调试模式下检查 map
中的值,从我的授权服务器建立的响应来看,一切看起来都应该是这样。
如果我需要post更多信息,请告诉我。
有没有人遇到过这个问题或者知道如何解决这个问题?
我找到了"solution"。
我的 pom 文件版本不匹配。虽然我的身份验证服务器是 运行 spring-security-oauth2-2.0.5.RELEASE
我的资源服务器是 运行 spring-security-oauth2-2.0.7.RELEASE
.
版本声明响应不同。
我认为 DefaultAccessTokenConverter 的实现有一个错误,因为 spring-security-oauth2 2.0.7.RELEASE,因为这一行:
if (user==null && map.containsKey(AUTHORITIES)) { ... }
为什么会出现“user==null”条件? "user" 变量不为空,因此条件永远不会为真,并且 authorities 数组未填充。
我认为这是一个 Spring 安全 Oauth2 实施错误。