在我的 Java Spring Boot 3 应用程序中,我想将 Spring Security 与@PreAuthorize/一起使用@PostAuthorize。由于某种原因,我收到的 Keycloak 生成的令牌没有Authorities像 Spring 期望的那样具有角色,而是在"realm_access"属性下。
因此,我决定继续实现一个自定义表达式处理程序,遵循我在https://docs.spring.io/spring-security/reference/servlet/authorization/method-security.html#customizing-expression中找到的内容-处理
所以,一些代码
表达式根
public class CustomMethodSecurityExpressionRoot
extends SecurityExpressionRoot implements MethodSecurityExpressionOperations {
public CustomMethodSecurityExpressionRoot(Authentication authentication) {
super(authentication);
}
public boolean hasRealmRole(String role) {
var principal = ((OAuth2AuthenticatedPrincipal)this.getPrincipal());
if (principal == null) {
return false;
}
var realmAccess = (JSONObject)principal.getAttribute("realm_access");
if (realmAccess == null) {
return false;
}
var roles = (JSONArray)realmAccess.get("roles");
if (roles == null || roles.isEmpty()) {
return …Run Code Online (Sandbox Code Playgroud)