使用RemoteTokenService时未获得客户机构/角色

时间:2014-10-10 04:16:19

标签: spring oauth spring-security oauth-2.0 spring-security-oauth2

我正在使用Spring-Security-OAuth2来实现我自己的oauth服务器和资源服务器。我在我的ResourceServer上使用RemoteTokenService作为我的ResourceServerTokenService,它将使用OAuth服务器上的CheckTokenEndpoint(/ oauth / check_token)对任何accessToken进行身份验证。

我为api url添加了一个antMatcher,例如/ data / list需要客户端应用程序角色/权限:“ ROLE_ADMIN ”,如此.antMatcher('/data/list').access("#oauth2.clientHasRole('ROLE_ADMIN')")

但它不起作用。 我在这个终点上做了一些试验和错误,我得到的是:::

当oauth grant仅为客户端时,即client_credential grant。 我们从/ oauth / check_token获得了什么

{
 "scope":["read"],
 "exp":1412955393,
 "client_id":"sample_test_client_app"
}

我们没有获得任何客户端权限。那么Spring安全性如何在"#oauth2.clientHasRole('ROLE_ADMIN')"

的授权检查之上执行

当oauth grant是user + client,即Authorization_code grant时 我们从/ oauth / check_token获得了什么

{
 "aud":["resource_id"],
 "exp":1412957540,
 "user_name":"developer",
 "authorities":["ROLE_USER"],
 "client_id":"sample_test_client_app",
 "scope":["read"]
}

对于authorization_code grnat,我们仍然没有获得客户端权限/角色。所以任何人都可以告诉我如何在任何api url上执行clientHasRole身份验证?

1 个答案:

答案 0 :(得分:2)

"#oauth2.clientHasRole(' ROLE_ADMIN')"为了工作,我们必须实现我们的AccessTokenConverter并将其注入auth服务器和资源服务器。

所以创建一个新的类,扩展DefaultAccessTokenConverter并覆盖convertAccessTokenextractAuthentication方法。

convertAccessToken方法中添加

Map<String, Object> response = (Map<String, Object>) super.convertAccessToken(token, authentication);
OAuth2Request clientToken = authentication.getOAuth2Request();
response.put("clientAuthorities", clientToken.getAuthorities());

并在extractAuthentication方法中添加

Collection<HashMap<String, String>> clientAuthorities = (Collection<HashMap<String, String>>) map.get("client_authority");

Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();

for (HashMap<String, String> grantedAuthority : clientAuthorities) {
   for (String authority : grantedAuthority.values()) {
       grantedAuthorities.add(new SimpleGrantedAuthority(authority));
   }
}

Set<String> resourceIds = new LinkedHashSet<String>(map.containsKey(AUD) ? (Collection<String>) map.get(AUD) : Collections.<String> emptySet());
OAuth2Request request = new OAuth2Request(parameters, clientId, grantedAuthorities, true, scope, resourceIds, null, null, null);
  • 在auth服务器上:

    AuthorizationServerEndpointsConfigurer

  • 中设置此课程
  • 在资源服务器上:

    RemoteTokenServices

  • 中设置此课程