当前位置: 首页 > 知识库问答 >
问题:

将领域角色和资源角色与KeyClope/SpringSecurity一起使用

赵星华
2023-03-14

我试图在一个带有spring security和KeyClope的java应用程序中同时使用领域和资源角色。不幸的是,KeyClope只会返回一个或另一个,具体取决于:

keycloak.use-resource-role-mappings=true

您仍然可以通过自定义代码获得这两种方法,但它会弄乱@PreAuthorize或spring boot方法等注释。isUserInRole,这会导致难看的代码。

有没有办法覆盖@PreAuthorize方法或JSON令牌Keycloak返回,以便同时使用领域和资源角色?目前,我的keyclok实现在每个方法的开头使用一个自定义方法来替换@PreAuthorize,这并不漂亮。

提前谢谢你。

共有1个答案

锺威
2023-03-14

当我在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