Spring 安全 WSO2 IS 集成 - 弄清楚如何分配 authorities/customize wso2 令牌

Spring security WSO2 IS integration - Figure out how to assign authorities/customize wso2 token

几天来我一直被这个问题困扰。

所以我要做的是使用 spring 安全框架分配 ROLES。我的目标是解码我通过 openid 从 WSO2 Identity Server 5.0 获得的令牌并分配角色,这样我就可以根据角色 (AUTHORITIES)

授权请求

这是我的 SecurityConfig class 简单 spring 启动应用程序

@Profile("oauth")
@Configuration
@EnableResourceServer
public class SecurityConfig {

}

因此,使用此配置,我能够解码令牌。

但是,在调试模式下,当我使用 id_token 向简单的 spring 启动应用程序发出请求时,我收到了一个错误:

java.lang.ClassCastException
java.lang.String 无法转换为 java.util.Collection

并且它发生在 DefaultAccessTokenConverter class 中,特别是在将地图对象转换为 String [] roles

的代码行中
public OAuth2Authentication extractAuthentication(Map<String, ?> map) {
    ...
    if (user==null && map.containsKey(AUTHORITIES)) {
        @SuppressWarnings("unchecked")
        String[] roles = ((Collection<String>)map.get(AUTHORITIES)).toArray(new String[0]);
        authorities = AuthorityUtils.createAuthorityList(roles);
    }
    OAuth2Request request = new OAuth2Request(parameters, clientId, authorities, true, scope, resourceIds, null, null,
            null);
    return new OAuth2Authentication(request, user);
}

这是我的 WSO2 解码令牌

{
"auth_time": 1464819792, "exp": 1464823490,
"azp": "U1PXsuyV_tdBERmZIoHHnqoGkWIa",
"authorities": "[\"ROLE_ADMIN\",\"approver\",\"Internal\/everyone\"]",
"at_hash": "Hh2LUZl3Bp6yDqyZt4r6Gg",
"aud": [
"U1PXsuyV_tdBERmZIoHHnqoGkWIa"
],
"iss": "https://localhost:9443/oauth2/token", "locality": "[\"ROLE_ADMIN\"]", "iat": 1464819890 }

好像Spring需要Array of String,而不是String对象(authorities中value的首尾有双引号。

aud 格式似乎是 spring 所期望的格式。

所以,我可以想到两个选项 o
1. 在Spring Oauth2 中写一些配置(我还没想好)
2. 配置 WSO2 身份服务器(这是我一直在尝试做的)。

有一些资源说我们可以在 WSO2 carbon 中实现我们自己的 JWTTokenGenerator。从代码来看,似乎这是在声明中生成双引号的地方。

org.wso2.carbon.identity.oauth2.authcontext.JWTTokenGenerator

我希望有人经历过这个。

非常感谢。

请在此处找到默认实现 [1]。此外,如果您可以使用 IS 5.1.0 for 5.1.0 参考 [2],那就更好了。构建自定义 JWTTokenGenerator 后,将其复制到 repository/components/lib。更改

<TokenGeneratorImplClass> 

identity.xml 中的元素根据您的自定义实现。

[1] https://svn.wso2.org/repos/wso2/carbon/platform/branches/turing/components/identity/org.wso2.carbon.identity.oauth/4.2.3/src/main/java/org/wso2/carbon/identity/oauth2/authcontext/JWTTokenGenerator

[2]https://github.com/wso2/carbon-identity/tree/master/components/oauth/org.wso2.carbon.identity.oauth/src/main/java/org/wso2/carbon/identity/oauth2/authcontext

谢谢!那也可以!但为了更容易实现,我们使用生成字符串数组的 5.2.0 beta 版本。 T