gpt4 book ai didi

spring - 如果我们想控制后端的访问,为什么我们需要 Keycloak 权限/策略/范围?

转载 作者:行者123 更新时间:2023-12-05 05:38:08 24 4
gpt4 key购买 nike

如果我们仍然根据用户角色验证每个资源的用户,我仍然无法理解 keycloak 权限/范围/策略的目的。我使用 Spring Boot,所有文档都显示角色必须包含在配置中:

...
.antMatchers("/api/account").hasRole("account")
.anyRequest()
.authenticated();

我们已经在 keycloak 中配置了上述策略,但在后端我们再次检查用户角色。为什么我们需要keycloak策略配置?

在keycloak中,我们可以创建授权范围。我如何使用该范围来保护基于此范围的 api?

我找不到将授权范围添加到 JWT token 中的方法,但 keycloak 提供了 UMA 端点来获取范围,但这是正确的实现方式吗?

最佳答案

默认情况下,spring-security 基于用户“授予的权限”(在 spring 世界中,角色只是带有 ROLE_ 前缀的权限)。 JWT 的 Spring-boot 默认配置将范围转换为权限。
但是您可以在@PreAuthorize()@PostAuthrize() 中使用SpEL,并编写涉及用户权限以外的安全规则。参见例如取自 here 的表达式:

@PreAuthorize("is(#grantingUsername) or hasAuthority('USERS_ADMIN') or onBehalfOf(#grantingUsername).can('PROXIES_EDIT')")

它检查用户:

  • 是“授予用户”:从 JWT token 中检索到的用户名等于 grantingUsername 路径变量
  • 被授予 USER_ADMIN 权限
  • 通过“授予用户”授予 PROXIES_EDIT 权限

您可以根据安全上下文(从访问 token JWT 创建的 Authentication 实例)和带注释的方法参数或返回值,使用安全 SpEL 编写任何内容。

OpenID 标准仅定义了资源所有者身份 必须如何呈现。它不包含任何关于权限的具体信息。

因此,每个授权服务器都使用自己的私有(private)权限声明(角色、资源访问等)。

默认情况下,Keycloak 在 realm_access.roles 声明中公开了 realm 角色。您还可以使用 client roles 映射器添加特定于 client 的用户角色(在管理控制台中:clients -> some-client -> mappers 然后点击 Add Builtin 按钮)。这会将客户端角色置于声明中,例如 resource_access.some-client.roles。您还可以编写自己的映射器,以根据需要提供任何声明(我写了 such a mapper here )。但所有这些都是 Keycloak 特有的。

如果您已经在 Keycloak 中定义了用户角色(或您的安全规则所基于的任何角色),您应该可以在 JWT 访问 token 中找到它(在类似 https://jwt.io 的工具中打开它进行检查)。如果是这样,您需要做的就是用从 Keycloak 特定角色声明中提取权限的转换器替换 Spring 默认 JwtGrantedAuthoritiesConverter(它将范围转换为权限)。

您也可以使用我为 spring-boot OpenID resource-servers 编写的库.

请引用tutorials在这个 repo 中开始。 resource-server_with_oauthentication可以在 5 分钟内为您提供具有基于角色的访问控制的资源服务器(包括安全规则单元测试)。

如果您想做一些基于角色的访问控制以外的事情,您将不得不覆盖更多的@Beans 和 spring-security 组件。你可以从这个advanced tutorials开始或 complete applicationapi 模块我从上面提取了安全表达式。

关于spring - 如果我们想控制后端的访问,为什么我们需要 Keycloak 权限/策略/范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73008055/

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