Keycloak docs on OpenID Connect指出
访问令牌由领域进行数字签名,并且包含访问权限 应用程序可以用来执行以下操作的信息(例如用户角色映射) 确定允许用户访问的资源 应用。
能否通过Keycloak在身份验证后返回的访问令牌来确定允许用户访问哪些资源? 在keycloak quickstart's instructions on Obtaining an OAuth2 Access Token之后,我得到了以下JWT(忽略了不相关的字段):
{
"aud": "app-authz-springboot",
"sub": "9c6c4a66-bb14-420f-a8af-3b2771266b38",
"typ": "Bearer",
"azp": "app-authz-springboot",
"realm_access": {
"roles": [
"user"
]
},
"resource_access": {},
"preferred_username": "alice"
}
有一个空字段
resource_access
是否可以用用户可以访问的资源来填充它?这个领域的规格是什么?在JWT RFC或OpenID Connect Spec
中找不到它我尝试了另一种可行的方法:
Exchanging the obtained token for rpt稍有 修改添加 response_mode 参数:
curl -v -X POST \
http://localhost:8180/auth/realms/spring-boot-quickstart/protocol/openid-connect/token \
-H "Authorization: Bearer "$access_token \
--data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
--data "audience=app-authz-rest-springboot" \
--data "permission=Default Resource"
--data "response_mode=decision"
但是,此解决方案要求向Keycloak分派2个请求,以确定是否允许用户使用特定资源。
答案 0 :(得分:0)
您的使用情况尚不清楚。控制对特定资源的访问的标准机制是 角色 ,您可以将它们作为令牌的一部分来获取。因此,如果您使用适当的角色模型配置对端点的访问,并将所需的角色分配给相应的用户,它将控制访问。实际上,这是在问题中引用的SpringBoot example中管理对/api/premium
URL的访问的方式(比较 alice 与 jdoe 的访问)。
从现在的问题出发,目前尚不清楚为什么这种方法对您不起作用,以及您为什么想要其他东西。