当前位置: 代码迷 >> java >> 在提取RPT令牌后,如何使用密钥斗篷实现授权,如何将资源名称与控制器映射并取消对用户的授权
  详细解决方案

在提取RPT令牌后,如何使用密钥斗篷实现授权,如何将资源名称与控制器映射并取消对用户的授权

热度:52   发布时间:2023-07-27 09:41:44.0

我正在开发一个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详细信息并限制某些控制器。

不确定是否正在使用任何密钥斗篷适配器,如果您正在实现一个用于游戏框架的适配器,则不需要存储权限,您可以直接从令牌端点获取总体决策,例如:

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 更多详细信息

我发现使用“自定义注释”可以更好地解决此问题,如果用户无法访问这些资源,它将限制特定的API。

请在这里参考: :

基于此,您可以将值设置为资源名称,并在用户每次调用API时进行检查。

例如。 @Authorization(默认资源)

@Authorization(Default Resource)
public class getPassword(){
...
...
...
}

在每个API调用之前添加此行。 在这里,只有会话中具有默认资源的用户才能成功获取密码。

  相关解决方案