从 Keycloak 生成的 JWT 确定用户是否有权访问特定资源

rok*_*rok 5 authorization oauth-2.0 jwt openid-connect keycloak

OpenID Connect 上的 Keycloak 文档指出

访问令牌由领域进行数字签名,并包含应用程序可用于确定允许用户访问应用程序上的哪些资源的访问信息(如用户角色映射)。

是否可以从 Keycloak 认证后返回的访问令牌中确定允许用户访问哪些资源?按照keycloak 快速入门关于获取 OAuth2 访问令牌的说明,我得到以下 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"
}
Run Code Online (Sandbox Code Playgroud)

有一块空地

资源访问

有没有办法用用户有权访问的资源填充它?这个领域的规范是什么?在JWT RFCOpenID Connect Spec 中找不到它

我尝试了另一种有效的方法:

  1. 使用密码凭证流程获取访问令牌
  2. 将获得的令牌交换为 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"
    
    Run Code Online (Sandbox Code Playgroud)

但是,此解决方案需要向 Keycloak 分派 2 个请求,以确定是否允许用户使用特定资源。

Ser*_*gGr 2

您的使用场景不清楚。控制对特定资源的访问的标准机制是角色,您可以将它们作为令牌的一部分。因此,如果您使用适当的角色模型配置对端点的访问并将所需的角色分配给相应的用户,它将控制访问。实际上,这是您在问题中引用的SpringBoot 示例/api/premium中管理对 URL 的访问的方式(比较alicejdoe的访问)。

从您现在的问题来看,尚不清楚为什么这种方法对您不起作用以及为什么您想要其他方法。