我正在开发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:test
和write: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端点的作用域,并限制每个用户的作用域?
2条答案
按热度按时间oug3syen1#
作用域不是角色
您可能会看到:
作用域是由OAuth2规范定义的,但没有关于角色、组、权限、赠款或任何用户访问表示的内容。授权服务器供应商为此使用私有声明。
默认情况下,Keycloak使用
realm_access.roles
和resource_access.{client-ID}.roles
,但您可以定义自己的Map器来使用任何您喜欢的声明。将Keycloak角色转换为Spring权限
由于OAuth2中没有角色标准,Spring default authorities converter使用scope claim作为源,并使用
SCOPE_
作为每个条目的前缀。这是很少令人满意的,你经常需要提供自己的权威转换器。
完成工作样本
参见my tutorials。除了工作示例之外,您还可以找到一些您似乎缺少的OAuth2 / OpenID背景。
laik7k3q2#
作用域在设计时是固定的,不提供完整的授权解决方案。当您希望对每个用户进行动态授权时,必须改用声明。按照您的意愿将用户安排到角色中。在Keycloak中,在令牌发行时,在令牌中包含以下值:
更一般地说,可以将范围看作是一个业务领域,由声明组成。查看Keycloak索赔Map器,了解供应商管理此问题的特定方法。
在验证JWT访问令牌之后,Spring资源服务器将只在经过身份验证的主体中接收这些值。然后,您可以在API的业务授权代码中使用这些值。
下面是我的一些示例代码,让您了解如何注入声明,然后将其用于业务授权。在某些情况下,注解可能会拒绝访问。在其他情况下,您需要执行一些操作,例如过滤集合以仅包含授权的项目。