我正在使用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身份验证?
答案 0 :(得分:2)
"#oauth2.clientHasRole(' ROLE_ADMIN')"为了工作,我们必须实现我们的AccessTokenConverter并将其注入auth服务器和资源服务器。
所以创建一个新的类,扩展DefaultAccessTokenConverter
并覆盖convertAccessToken
和extractAuthentication
方法。
在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