我正在使用Play Framework Rest API,它使用keycloak进行身份验证,现在正在向授权扩展,我已经提取了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细节和限制某些控制器。
不确定是否使用任何keycloak适配器,如果你正在实现一个playframework,你不需要存储权限,你可以直接从令牌端点得到一些像这样的事情的整体决定
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 documentation获得更多细节
我找到了一个更好的解决方案,使用Custom Annotation,如果用户无权访问这些资源,它将限制特定的API。
请参考这里:https://www.javatpoint.com/custom-annotation
基于此,您可以将值设置为资源名称,并在每次用户调用API时进行检查。
例如。 @Authorization(默认资源)结束
@Authorization(Default Resource)
public class getPassword(){
...
...
...
}
在每次API调用之前添加此行。这里只允许会话中具有默认资源的用户成功获取密码。