spring-security Sping Boot 密钥隐藏集成在@preauthorize中的角色为null

62o28rlo  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(152)

我正在尝试使用keycloak执行授权操作。
我的安全配置类工作正常,我成功地通过jwt令牌创建了身份验证,并执行了必要的角色Map。这可以通过安全上下文保持器清楚地看到。

我使用的是preauthorize注解,因为其中的权限为空,未提供授权,我得到403。

我还是不明白这怎么可能,你能帮忙吗?

vlf7wbxs

vlf7wbxs1#

经过长时间的挣扎,我找到了解决办法。

@Override
protected KeycloakAuthenticationProvider keycloakAuthenticationProvider() {
    return new KeycloakAuthenticationProvider() {

        @Override
        public Authentication authenticate(Authentication authentication) throws AuthenticationException {
            KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) authentication;
            List<GrantedAuthority> grantedAuthorities = new ArrayList<>();

            for (String role : ((KeycloakPrincipal) token.getPrincipal()).getKeycloakSecurityContext().getToken().getRealmAccess().getRoles()) {
                grantedAuthorities.add(new KeycloakRole(role));
            }

            return new KeycloakAuthenticationToken(token.getAccount(), token.isInteractive(), new SimpleAuthorityMapper().mapAuthorities(grantedAuthorities));
        }

    };
}

我们可以通过在Security配置类中使用以下方法将角色设置为KeycloakAuthenticationToken来实现解决方案。

相关问题