3

我正在尝试通过使用Keycloak-Quickstarts的app-authz-rest-springboot来熟悉 Keycloak 的授权服务概念。

我按照指南在本地运行keycloak-serverapp-authz-rest-springboot,它们按预期工作。但是,当我尝试将新端点添加到应用程序并将其保护为 app-authz-rest-springboot 中提供的其他端点时,我遇到了一个问题。

我尝试做的是将 HTTP 请求的请求正文转发给 keycloak 客户端的策略执行器,并根据请求正文决定是否应授予请求。

在应用程序方面,我有以下内容:

  1. 新端点:
  @PostMapping("/api/example")
  public String exampleEndpoint(@RequestBody RequestDto requestDto) {
    System.out.println(requestDto.getUserId());
    return createResponse();
  }
  1. 端点的请求正文:
public class RequestDto {

  public String userId;

  public RequestDto() {}

  public RequestDto(String userId) {
    this.userId = userId;
  }

  public String getUserId() {
    return userId;
  }

  public void setUserId(String userId) {
    this.userId = userId;
  }

  @Override
  public String toString() {
    return "RequestDto{" + "userId=" + userId + '}';
  }
}
  1. policy-enforcer-config将请求正文推送到 keycloak-policy-enforcer 以进行端点的权限评估
keycloak.policy-enforcer-config.paths[3].path=/api/example
keycloak.policy-enforcer-config.paths[3].claimInformationPointConfig.claims[user.id]={request.body['/userId']}

在密钥斗篷服务器端:

  1. 称为示例资源绑定的资源/api/example(上述端点)
  2. 自定义 js 策略,将端点的请求正文打印到标准输出并始终授予请求。
var context = $evaluation.context;
var attributes = context.attributes;
print(attributes.getValue('user.id').asString(0));
$evaluation.grant();
  1. 将示例资源(1)与自定义 js 策略(2)绑定的权限

我使用带有请求正文的 Postman 向应用程序发出请求:

{
    "userId": "blablabla"
}

自定义 js 策略脚本打印请求正文 10:37:46,387 INFO [stdout] (default task-6) blablabla ,这意味着应用程序将请求正文正确推送到 policy-enforcer。此外,keycloak 会成功授予请求。

虽然,在应用程序端,在 keycloak 的策略执行器拦截之后,请求失败并返回400 Bad RequestHTTP 状态和响应:

{
    "timestamp": "2021-11-25T08:37:46.454+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "Required request body is missing: public java.lang.String org.keycloak.quickstart.springboot.web.ApplicationController.exampleEndpoint(org.keycloak.quickstart.springboot.web.RequestDto)",
    "path": "/api/example"
}

似乎 keycloak 的策略执行者在权限评估后以某种方式从请求中“删除”了请求正文。这很奇怪,因为正如我所提到的,声明已成功推送到 keycloak 并且请求已成功授予。

有没有人遇到过类似的问题?或者我可以关注任何在线帖子或示例?我用谷歌搜索了很多,但不幸的是,我还没有找到任何东西。并且,keycloak-quickstarts 没有提供任何将请求正文推送到策略执行器的类似示例。这些示例仅限于展示如何将请求参数转发到 keycloak。

4

0 回答 0