我有一个keycloak服务器设置。我使用令牌端点:http://localhost:8080/auth/realms/demo/protocol/openid-connect/token对用户进行身份验证并生成令牌。据我所知,这个令牌可以在后续调用中使用,以验证它是否是有效用户。
但是,我不确定如何使用它来授权用户?ie验证此用户是否具有访问资源的角色。
我看到可以在client部分下配置资源URI。但一旦完成,我希望能够读取令牌并验证此用户是否具有访问此资源的角色。
现在,这就是我正在做的:我在这里使用了spring boot。
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)它将告诉我此用户是否具有访问此资源的角色(从token获得)。
如果这是可行的,请建议。
提前谢谢。Om
发布于 2021-01-09 01:20:40
有很多方法可以做到这一点。其中之一是使用Keycloak的角色,并将这些角色分配给用户。这样,在您的服务器/api中,您可以检查用户是否具有该角色,并继续或拒绝调用。
例如,在我的api项目中,我有一些系统管理员专用的端点,因此我有一个角色SystemAdministrators:

然后,如果您转到Users、Role Mappings,则可以将该角色添加到要设置为管理员的用户:

然后,任何api调用都应该包括一个持有者令牌(从Keycloak登录获得),在你的代码中,你可以解码这个jwt (这取决于你使用的是什么语言,我使用python,所以它很简单),它将有一个元素"realm_access“,里面有一个"role”元素,例如:
"realm_access": {
"roles": [
"offline_access",
"uma_authorization",
"SystemAdministrators"
]},
如果该元素包含角色SystemAdministrators,则表示该元素是系统管理员。
我发现这是最简单的方法。您可以使用角色属性来确定屏幕中的各个选项,等等(属性是键/值对,所以我实现的方式是,键是选项名称,值是权限级别,例如:"screen1":"read","screen2":"write",依此类推。为此,您需要使用keycloak admin api:https://www.keycloak.org/docs-api/6.0/rest-api/index.html#_roles_resource,它有许多可以帮助您的端点。
https://stackoverflow.com/questions/62982005
复制相似问题