spring-boot - 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)
这将告诉我该用户是否具有访问该资源的角色(从令牌获得)。
请建议这是否可行。
提前致谢。唵
解决方案
有很多方法可以做到这一点。其中之一是使用 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有许多可以帮助您的端点。
推荐阅读
- python - Pandas:AttributeError:“str”对象没有属性“isnull”
- python - 在python中替换xml文件的根元素
- user-interface - 我可以用 PySimpleGUI 制作视频播放器吗?
- ansible - 基于主机名后缀的ansible变量
- javascript - 使用函数时无法从 Angular 发布到 API
- python - 使用 for 循环使用数据框名称的列表值
- c - 我怎样才能加快我的 OpenCL 算法?
- flutter - Flutter:ChangeNotifierProxyProvider:未提供更新的正确状态
- google-api - 用于需要频道所有者详细信息的 youtube 频道数据列表 API
- unix - 有没有办法让 Unix diff -r 只比较文件名的差异,但不检查是否有任何单个文件实际上不同?