gpt4 book ai didi

spring-boot - Spring Keycloak 适配器权限策略执行器。如何设置

转载 作者:行者123 更新时间:2023-12-04 02:59:18 24 4
gpt4 key购买 nike

首先我正在使用

  • keycloak-authz-client-3.3.0.Final
  • Spring Boot 1.5.8.RELEASE
  • spring-boot-starter-security

  • 我一直在使用 Keycloak spring 适配器来探索示例,因为我们希望将它用于我们的项目。

    我能够使用本教程轻松地为角色运行它:
    https://dzone.com/articles/easily-secure-your-spring-boot-applications-with-k

    在那之后,我转向了权限,那是它变得棘手的时候(这也是我们的主要目标)。

    我想实现这里(9.1.2)中描述的东西:
    http://www.keycloak.org/docs/2.4/authorization_services_guide/topics/enforcer/authorization-context.html#
  • 要获得权限,您需要在 Keycloak 授权、凭据中设置,然后创建资源或范围和策略才能创建权限(我花了一段时间,但我让它工作了)。在评估器中测试一切似乎都很好。
  • 下一步是在 Spring 端获取用户权限。为此,我必须启用:
    keycloak.policy-enforcer-config.enforcement-mode=permissive

  • 我启用此功能的那一刻,我每次都会遇到此异常
    java.lang.RuntimeException: Could not find resource.
    at org.keycloak.authorization.client.resource.ProtectedResource.findAll(ProtectedResource.java:88)
    at org.keycloak.adapters.authorization.PolicyEnforcer.configureAllPathsForResourceServer...
    ...
    Caused by: org.keycloak.authorization.client.util.HttpResponseException:
    Unexpected response from server: 403 / Forbidden

    不管我在服务器上打什么地址。
  • 所以我开始调查问题的根源是什么。查看一些示例如何手动获取我在 postman 中实际获得的权限,请求如下:
    http://localhost:8080/auth/realms/ ${myKeycloakRealm}/authz/entitlement/${MyKeycloakClient}
    包括头授权:bearer ${accessToken}
    响应是 {"rpt": ${jwt token}} 实际包含权限
  • 因此,知道这是有效的,它一定是 Spring 适配器出了问题。进一步调查 Keycloak 异常,我发现该错误发生在适配器获取所有资源的那一刻。为此,它使用以下网址:
    http://localhost:28080/auth/realms/license/authz/protection/resource_set
    在 header 中使用不同的标记(我在调试时复制)
    因此,当我在 postman 中尝试时,我也收到了 403 错误,但带有 json 正文:

  • {
    “错误”:“invalid_scope”,
    "error_description": "需要 uma_protection 范围。"
    }

    我已在 keycloak 中启用和禁用所有 uma 配置,但无法使其正常工作。请有人指出我正确的方向吗?

    更新

    我现在已将 Keycloak 适配器更新为 3.4.0.final,但在 UI 中出现以下错误:

    格林威治标准时间 2017 年 11 月 20 日星期一 10:09:21
    出现意外错误(类型=内部服务器错误,状态=500)。
    找不到资源。服务器消息:{"error":"invalid_scope","error_description":"需要 uma_protection 范围。"}

    (几乎和我在 postman 请求中得到的一样)

    我还打印了所有用户角色以确保 uma_protection 角色存在,而且确实存在。

    我做的另一件事是禁用 spring 安全角色前缀,以确保它不会与角色不匹配。

    更新 2

    能够解决 403 问题(您可以在下面的回复中看到它)。
    从 HttpServletRequest 获取 KeycloakSecurityContext 仍然有问题

    更新 3

    能够像这样获得 KeycloakSecurityContext:
        Principal principal = servletRequest.getUserPrincipal();
    KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) principal;
    OidcKeycloakAccount auth = token.getAccount();
    KeycloakSecurityContext keycloakSecurityContext = auth.getKeycloakSecurityContext();

    AuthorizationContext authzContext = keycloakSecurityContext.getAuthorizationContext();

    现在的问题是 授权上下文 始终为空。

    最佳答案

    我已经通过将 uma_protection 角色添加到 来让它工作起来。 Keycloak 客户端配置中的服务帐户角色选项卡

    Here's the place where it is in Keycloak

    关于它的更多信息在这里:
    http://www.keycloak.org/docs/2.0/authorization_services_guide/topics/service/protection/whatis-obtain-pat.html

    解决方案的第二部分:

    即使安全限制对您没有多大意义,也必须实现安全限制。例子:

    keycloak.securityConstraints[0].authRoles[0] = ROLE1
    keycloak.securityConstraints[0].securityCollections[0].name = protected
    keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /*

    有用的演示:
    https://github.com/keycloak/keycloak-quickstarts

    关于spring-boot - Spring Keycloak 适配器权限策略执行器。如何设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47199243/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com