我试图在一个带有spring security和KeyClope的java应用程序中同时使用领域和资源角色。不幸的是,KeyClope只会返回一个或另一个,具体取决于:
keycloak.use-resource-role-mappings=true
您仍然可以通过自定义代码获得这两种方法,但它会弄乱@PreAuthorize或spring boot方法等注释。isUserInRole,这会导致难看的代码。
有没有办法覆盖@PreAuthorize方法或JSON令牌Keycloak返回,以便同时使用领域和资源角色?目前,我的keyclok实现在每个方法的开头使用一个自定义方法来替换@PreAuthorize,这并不漂亮。
提前谢谢你。
当我在SecurityConfig中使用KeyClope AuthenticationProvider时,它成功地覆盖了KeyClope AuthenticationProvider。以下是自定义提供程序的代码
public class CustomKeycloakAuthenticationProvider extends KeycloakAuthenticationProvider {
private GrantedAuthoritiesMapper grantedAuthoritiesMapper;
public void setGrantedAuthoritiesMapper(GrantedAuthoritiesMapper grantedAuthoritiesMapper) {
this.grantedAuthoritiesMapper = grantedAuthoritiesMapper;
}
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) authentication;
List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
for (String role : token.getAccount().getRoles()) {
grantedAuthorities.add(new KeycloakRole(role));
}
// ADDING THE MODIFICATION AND ENABLING ROLE FROM RESSOURCE
for (String role : token.getAccount().getKeycloakSecurityContext().getToken().getResourceAccess("CustomApplication").getRoles()) {
grantedAuthorities.add(new KeycloakRole(role));
}
return new KeycloakAuthenticationToken(token.getAccount(), token.isInteractive(), mapAuthorities(grantedAuthorities));
}
private Collection<? extends GrantedAuthority> mapAuthorities(
Collection<? extends GrantedAuthority> authorities) {
return grantedAuthoritiesMapper != null
? grantedAuthoritiesMapper.mapAuthorities(authorities)
: authorities;
}
@Override
public boolean supports(Class<?> aClass) {
return KeycloakAuthenticationToken.class.isAssignableFrom(aClass);
}
}
以及SecurityConfig中的修改
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
CustomKeycloakAuthenticationProvider keycloakAuthenticationProvider = CustomKeycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}
private CustomKeycloakAuthenticationProvider CustomKeycloakAuthenticationProvider() {
return new CustomKeycloakAuthenticationProvider();
}
谢谢你的帮助亚历山大!
传递用户表示。id to keydeposerverURL“/auth/admin/realms/XXXX/users/“userId”/role mappings/realm”我为某个用户获取这些角色。。。 我无法确定应该使用哪个API向用户添加/删除角色。 请告诉我需要使用什么API 我能找到的最好的是下面这个,但是我不知道params(路径和请求属性应该是)是什么...
我正在试验微服务和前端之间的角色映射(在Keycloak术语中是keycloak-clients)。 假设我有两个keycloak客户端: 路由管理-API 路由管理-WebApp 你对这种做法有什么看法?是正确的思维方式吗?我们需要王国角色做什么?
角色是一系列权限的集合,用户加入项目时的角色决定了用户在项目中的权限。 角色是一系列权限的集合,用户加入项目时的角色决定了用户在项目中的权限。 系统内置角色说明如下: 角色 权限 是否共享 权限范围 权限说明 admin sysadmin 全局共享 系统 用户只有以admin角色加入default的system项目时才有管理后台全部权限。 domainadmin domainadmin 全局共享
角色定义了对集群的指定命名空间下资源的权限。 角色定义了对集群的指定命名空间下资源的权限。多集群角色支持将角色关联到多个集群,并在指定集群中创建同样权限的角色。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “容器/多集群资源/角色” 菜单项,进入角色页面。 新建角色 该功能用于新建多集群角色。新建多集群角色之前请先创建多集群命名空间。 在角色页面,单击列表上方 “新建” 按钮,进
角色定义了对集群的指定命名空间下资源的权限。 角色定义了对指定命名空间里资源的权限,通过与服务账户进行绑定,从而控制服务账户的操作权限。 角色的详细介绍请参考Kubernetes官方文档-RBAC。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “容器/集群/角色” 菜单项,进入角色页面。 查看角色 该功能用于基于集群、命名空间筛选角色信息。 在角色页面,默认查看一个集群下所有命名
安全角色是由应用开发人员或装配人员定义的逻辑用户分组。当部署了应用,由部署人员映射角色到运行时环境的 principal 或组。 Servlet 容器根据 principal 的安全属性为与进入请求相关的principal 实施声明式或编程式安全。 这可能以如下任一方式发生: 部署人员已经映射一个安全角色到运行环境中的一个用户组。调用的principal 所属的用户组取自其安全属性。仅当 prin