当前位置: 首页 > 知识库问答 >
问题:

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

仉梓
2023-03-14

首先我在使用

  • keycloak-authz-client-3.3.0.final
  • Spring boot 1.5.8.发布
  • spring-boot-starter-security

我一直在玩Keycloak spring adapter,探索示例,因为我们想在我们的项目中采用它。

我可以使用以下教程轻松地让它在角色中运行:https://dzone.com/articles/elyly-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/entimenty/${MyKeycloakClient},包括头授权:承载${accessToken}响应是{“rpt”:${jwt token}},实际上包含了这些权限

    所以知道这是工作的,一定是Spring适配器出了问题。进一步研究Keycloak异常,我发现该错误在适配器获取所有资源的那一刻就发生了。因此,它使用了以下URL:http://localhost:28080/auth/realms/license/authz/protection/resource_set,头中有一个不同的令牌(我在调试时复制了它),所以当我在postman中尝试它时,我也得到了一个403错误,但使用的是json主体:

    {“error”:“invalid_scope”,“error_description”:“需要uma_protection范围。”}

    我已经启用和禁用了keycloak中的所有uma配置,但我无法使其工作。有人能给我指个正确的方向吗?

    更新

    格林威治时间2017年11月20日上午10:09:21出现意外错误(类型=内部服务器错误,状态=500)。找不到资源。服务器消息:{“error”:“invalid_scope”,“error_description”:“需要uma_protection scope.”}

    (和我在邮递员的请求中得到的差不多)

    我还打印了所有的用户角色,以确保uma_protection角色在那里,它确实在那里。

    能够像这样获得KeycloakSecurityContext:

        Principal principal = servletRequest.getUserPrincipal();
        KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) principal;
        OidcKeycloakAccount auth = token.getAccount();
        KeycloakSecurityContext keycloakSecurityContext = auth.getKeycloakSecurityContext();
    
        AuthorizationContext authzContext = keycloakSecurityContext.getAuthorizationContext();
    

    现在的问题是AuthorizationContext总是为空。

  • 共有1个答案

    颛孙飞鸾
    2023-03-14

    我通过在Keycloak客户机配置中的服务帐户角色选项卡中添加uma_protection role来使它工作

    有关它的更多信息,请参见http://www.keycloak.org/docs/2.0/authorization_services_guide/topics/service/protection/whatis-greate-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

     类似资料:
    • 所以我有一个应用程序,它使用vaadin(14)和keycloak Spring Boot适配器(11)。我查看了名为“app-authz-springboot”的spring boot的keycloaks授权示例:https://github.com/keycloak/keycloak-quickstarts/tree/lates/app-authz-springboot。当我执行示例时,一切都

    • 权限适配 适配Android7.0权限,需要做以下设置: 在您自己工程的AndroidManifest.xml中添加以下代码。 <provider android:name="android.support.v4.content.FileProvider" android:authorities="${packageName}.fileProvider"

    • 我有两个片段:(1)图书馆片段,(2)书片段 图书馆碎片通过RecyclerView显示所有可用的书籍。用户可以在每个RecyclerView项目上设置标签,这将把LiveData设置为相应的图书。同时,书籍片段将被打开,并显示该书的内容。 我在ViewHolder类中设置了一个onClickListener,它位于图书馆片段的RecyclerView. Adapter中。因此,当单击一个项目时,

    • 我的Dockerfile配置: 报错信息: 我已经尝试过以下几种方法: Dockerfile配置中添加RUN chmod -R 777 /yice Dockerfile配置添加 USER root,它会报: 找不Chrome,然后因为ghcr.io/puppeteer/puppeteer:latest镜像切换的用户名为pptruser,所以我手动在代码里给puppeteer配置executable

    • 问题内容: 假设我有一个域,它指向某个IP地址,另一个域,它指向另一个IP地址。从Ajax请求下载的文件可以发送到吗? 现代浏览器如何严格执行同域策略? 问题答案: 对您的问题的简短回答是:否:对于AJAX调用,您只能访问与加载页面时相同的主机名(和端口/方案)。 有两种解决方法:一种是在其中创建一个URL 作为URL 的反向代理。只要主机名匹配,浏览器就不在乎请求的实际位置。如果您已经有一个前端

    • 我正在开发一个使用Keycloak作为身份验证服务的Node.js web应用程序。我已经有两个客户机:用于web应用程序(app-web)的client和用于API(app-api)的。在app-api上,我使用资源、范围、策略和权限来控制访问。 为了检查权限,我使用模块(npm keycloak-connect)中的。当我尝试检查权限时,服务器总是返回响应。但是,如果我将app-api从更改为