gpt4 book ai didi

java - 将 Realm 角色和资源角色与 Keycloak/Spring Security 一起使用

转载 作者:行者123 更新时间:2023-12-02 09:01:04 27 4
gpt4 key购买 nike

我试图在带有 spring-security 和 keycloak 的 java 应用程序中使用 Realm 和资源角色。不幸的是,keycloak 只会根据以下值返回其中之一:

keycloak.use-resource-role-mappings=true

您仍然可以使用自定义代码获取两者,但它会弄乱 @PreAuthorize 或 spring-boot 方法 .isUserInRole 等注释,从而导致代码难看。

有没有办法覆盖 @PreAuthorize 方法或 Keycloak 返回的 JSON token ,以便同时使用 Realm 和资源角色?目前,我的 keyclaok 实现使用自定义方法来替换每个方法开头的 @PreAuthorize,但它并不漂亮。

提前谢谢您。

最佳答案

当我在 SecurityConfig 中使用它时,它可以覆盖 KeycloakAuthenticationProvider。这是自定义提供程序的代码

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();
}

感谢亚历山大的帮助!

关于java - 将 Realm 角色和资源角色与 Keycloak/Spring Security 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60147364/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com