oauth2.0 Keycloak:如何设置和限制每个用户的资源服务器范围

clj7thdc  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(271)

我正在开发Sping Boot 3和Spring Security 6应用程序。应用程序是REST API。我将使用Spring Security,Spring Security资源服务器进行授权。端点将使用@PreAuthorize("hasAuthority('SCOPE_scope-name')")进行注解,以限制对其的访问。我想用OIDC,JWT。
我将使用keycloak作为授权服务器。现在,我想限制特定用户组对resources/API的访问。假设我有用户a,B,c和x,y。用户a、B、c将有权访问作用域read:testwrite:test。但是用户x,y只能访问作用域read:test。即使用户x,y请求write:test作用域,keycloak也不会将作用域提供给这些用户。
最好使用用户组来轻松管理用户。优选地,将创建一些角色并将其分配给用户组。每个角色都有一组作用域,该作用域允许访问。我试着阅读文档。我很困惑。在不同的地方有不同的作用域和角色。我不知道我如何才能实现我想做的事情。
根据spring security documentation,在application.properties文件中,我只需要设置spring.security.oauth2.resourceserver.jwt.issuer-uri。我不明白keycloak/spring应用程序如何从issuer-uri设置中知道哪个客户端/资源服务器是这个应用程序。

在keycloak中,如何为资源服务器设置、管理API端点的作用域,并限制每个用户的作用域?

oug3syen

oug3syen1#

作用域不是角色

您可能会看到:

  • 角色作为允许用户执行的操作
  • 允许客户端代表用户执行的操作范围

作用域是由OAuth2规范定义的,但没有关于角色、组、权限、赠款或任何用户访问表示的内容。授权服务器供应商为此使用私有声明。
默认情况下,Keycloak使用realm_access.rolesresource_access.{client-ID}.roles,但您可以定义自己的Map器来使用任何您喜欢的声明。

将Keycloak角色转换为Spring权限

由于OAuth2中没有角色标准,Spring default authorities converter使用scope claim作为源,并使用SCOPE_作为每个条目的前缀。
这是很少令人满意的,你经常需要提供自己的权威转换器。

完成工作样本

参见my tutorials。除了工作示例之外,您还可以找到一些您似乎缺少的OAuth2 / OpenID背景。

laik7k3q

laik7k3q2#

作用域在设计时是固定的,不提供完整的授权解决方案。当您希望对每个用户进行动态授权时,必须改用声明。按照您的意愿将用户安排到角色中。在Keycloak中,在令牌发行时,在令牌中包含以下值:

{
  scope: orders,
  role: customer,
  access_level: read
}

更一般地说,可以将范围看作是一个业务领域,由声明组成。查看Keycloak索赔Map器,了解供应商管理此问题的特定方法。

    • 使用声明**

在验证JWT访问令牌之后,Spring资源服务器将只在经过身份验证的主体中接收这些值。然后,您可以在API的业务授权代码中使用这些值。
下面是我的一些示例代码,让您了解如何注入声明,然后将其用于业务授权。在某些情况下,注解可能会拒绝访问。在其他情况下,您需要执行一些操作,例如过滤集合以仅包含授权的项目。

相关问题