【发布时间】:2021-02-14 10:38:03
【问题描述】:
我有一个使用 Keycloak 11.0.2 保护的 Spring Boot 应用程序,我的 Keycloak 设置如下:
- 一个名为
Central的领域,角色为CentralWebUser,客户端为SpringWeb。客户有-
Access Type:public并且只启用了一个流,即Standard Flow Enabled -
Valid Redirect URIs: http://localhost:8000/*
-
- 一个名为
SpringApp的 2ª 领域,角色WebUser和客户端spring_brokering- 一个名为
springuser的用户具有领域角色WebUser - 客户端
spring_brokering只有Standard Flow Enabled设置为ON,Valid Redirect URIs:http://localhost:8080/*,和Access Type:Confidential
- 一个名为
第二个领域是第一个领域的 IDP。因此,要登录用户转到Central 登录页面并选择IDP SpringAppIDP。
IDP配置如下:
-
alias:SpringAppIDP,除了启用的选项外,其他所有内容均为OFF - 授权 URL、令牌 URL 等设置为来自
SpringApp端点的 URL(e.g.,Authorization URL: http://127.0.0.1:8080/auth/realms/SpringApp/protocol/openid-connect/auth) - 客户端 ID 和客户端密码分别是
spring_brokering及其密码。
在 Spring 方面,我有以下属性值得一提:
server.port = 8000
keycloak.realm = Central
keycloak.auth-server-url = http://localhost:8080/auth
keycloak.ssl-required = external
keycloak.resource = SpringWeb
keycloak.public-client=true
keycloak.security-constraints[0].authRoles[0]=WebUser
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/services/*
当我访问 http://127.0.0.1:8080/services 时,我被重定向到 Keycloak Central 领域登录页面,然后我单击 SpringAppIDP 并输入用户名 springuser 及其密码。登录成功,但是我得到了一个access denied,这意味着用户springuser没有WebUser的角色。但是,该角色是在第二个领域内分配给该用户的(即SpringApp)。
有趣的是,如果在第一个 Realm 中创建身份提供者 Mapper External Role to Role(在 IDP SpringAppIDP 配置中)将 WebUser 的外部角色映射到 CentralWebUser 并将 spring 属性更改为:
keycloak.security-constraints[0].authRoles[0]=CentralWebUser
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/services/*
我能够登录,这意味着 Keycloak 知道用户拥有WebUser 角色,因此将该角色映射到CentralWebUser 角色。
我想知道是否可以将角色从外部 IDP 显式导入到内部?或者,如果(以及如何)我可以代表用户请求一个令牌,该令牌将拥有来自该令牌中 Central 和 SpringWeb 领域的用户角色,而无需为每个用户显式创建角色映射器角色。
【问题讨论】:
标签: java spring spring-security keycloak jdbcrealm