问题描述
我正在开发一个Play Framework Rest API,该API使用密钥斗篷进行身份验证,现在扩展到授权,我提取了RPT令牌并根据资源名称存储了权限访问权限。 但是现在我不知道如何用资源名称映射我的控制器,并限制用户使用某些只能由管理员或其他角色使用的功能。 许可的结构为:
"authorization": {
"permissions": [
{
"rsid": "4bxxxxxx-xxxxx-xxxxx-xxxx-xxxxxxx",
"rsname": "Default Resource"
},
{
"rsid": "8xxxxxx-xxxxx-xxxxx-xxxx-xxxxxxx",
"rsname": "admin_res"
},
{
"rsid": "cxxxxxx-xxxxx-xxxxx-xxxx-xxxxxxx",
"rsname": "superAdmin_res"
}
]
},
我将所有rsname存储在列表中,并在会话中本地存储。
现在,我只想基于资源名称控制api调用并限制控制器调用。
我有一个KeyCloakSessionAction,它扩展了一个action.simple,所以我该如何传递auth详细信息并限制某些控制器。
1楼
不确定是否正在使用任何密钥斗篷适配器,如果您正在实现一个用于游戏框架的适配器,则不需要存储权限,您可以直接从令牌端点获取总体决策,例如:
curl -X POST
http://localhost:8080/auth/realms/${realm}/protocol/openid-connect/token
-H "Authorization: Bearer ${access_token}"
--data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket"
--data "audience={resource_server_client_id}"
--data "permission=Resource A#Scope A"
--data "response_mode=decision"
回应将是
{
'result': true
}
您可以从keycloak 更多详细信息
2楼
我发现使用“自定义注释”可以更好地解决此问题,如果用户无法访问这些资源,它将限制特定的API。
请在这里参考: :
基于此,您可以将值设置为资源名称,并在用户每次调用API时进行检查。
例如。 @Authorization(默认资源)
@Authorization(Default Resource)
public class getPassword(){
...
...
...
}
在每个API调用之前添加此行。 在这里,只有会话中具有默认资源的用户才能成功获取密码。