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

Implementing Authorization using keycloak, after extracting the RPT token how to map the Resource Name with the controllers and unauthorize a user

我正在开发 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 调用并限制控制器调用。

我有一个扩展到 action.simple 的 KeyCloakSessionAction,所以我如何传递授权详细信息并限制某些控制器。

不确定是否正在使用任何 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

获取更多详细信息

我找到了一个更好的解决方案,使用自定义注释,如果用户无权访问这些资源,它将限制特定的 API。

请参考这里:https://www.javatpoint.com/custom-annotation

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

For eg. @Authorization(Default Resource) over

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

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