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 中的元素根据您的自定义实现。
谢谢!那也可以!但为了更容易实现,我们使用生成字符串数组的 5.2.0 beta 版本。 T
几天来我一直被这个问题困扰。
所以我要做的是使用 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 中的元素根据您的自定义实现。
谢谢!那也可以!但为了更容易实现,我们使用生成字符串数组的 5.2.0 beta 版本。 T