首页 > 解决方案 > Keycloak:用于检查用户令牌是否具有特定资源角色的 API

问题描述

我有一个 keycloak 服务器设置。我正在使用令牌端点:http://localhost:8080/auth/realms/demo/protocol/openid-connect/token对用户进行身份验证并生成令牌。我理解的这个令牌可以在后续调用中用于验证它是否是有效用户。

但是,我不确定如何使用它来授权用户?即验证此用户是否具有访问资源的角色。

我看到可以在客户端部分下配置资源 URI。但是一旦完成,我希望能够读取令牌并验证此用户是否具有访问此资源的角色。

现在,这就是我正在做的事情:我在这里使用过弹簧靴。

doSomething(String token)
{
 1. get token info using: http://localhost:8080/auth/realms/demo/protocol/openid-connect/userinfo
 2. from this get the roles the user has
 3. Manually check the roles required for the above function. (Right now, this is set in a simple switch statement)
 4. If the role obtained from step 2 matches what we get in step 3, go ahead. Else return failure.
}

我想知道上面的步骤 3 是否可以以更好的方式完成。我知道您可以从 keycloak 控制台在客户端中设置资源。我希望我们可以将上面的 4 个步骤替换为:

keycloakAPIToAuthorizeToken(token,resource)

这将告诉我该用户是否具有访问该资源的角色(从令牌获得)。

请建议这是否可行。

提前致谢。唵

标签: spring-bootoauth-2.0keycloakkeycloak-rest-api

解决方案


有很多方法可以做到这一点。其中之一是使用 Keycloak 的角色,并将这些角色分配给用户。这样,在您的服务器/api 中,您可以检查用户是否具有该角色并继续或拒绝呼叫。

例如,在我的 api 项目中,我有一些系统管理员专用的端点,所以我有一个角色 SystemAdministrators:

在此处输入图像描述

然后,如果您转到用户,角色映射,您可以将该角色添加到用户以设置为管理员:

在此处输入图像描述

然后,任何 api 调用都应该包含一个不记名令牌(从 Keycloak 登录获得),在您的代码中,您可以解码这个 jwt(这将取决于您使用的语言,我使用 python,所以它非常简单),它将有一个元素“realm_access”及其内部,一个“角色”元素,例如:

  "realm_access": {
      "roles": [
          "offline_access",
          "uma_authorization",
          "SystemAdministrators"
]

},

如果该元素包含角色 SystemAdministrators,您就知道是系统管理员。

我发现这是最简单的方法。您可以花哨并使用角色属性来确定屏幕内的各个选项等(属性是键/值对,所以我实现的方式是,键是选项名称,值是权限级别,例如:“screen1 ": "read", "screen2": "write" 等等。为此,您需要使用 keycloak 管理 api:https ://www.keycloak.org/docs-api/6.0/rest-api /index.html#_roles_resource有许多可以帮助您的端点。


推荐阅读