Thymeleaf 和 Spring 安全 - 自定义 SpEL 表达式

Thymelaf and Spring Security - custom SpEL expression

我正在使用具有 spring 安全性的 Thymeleaf。 在 html 代码中,我正在检查用户角色:

<li class="has-sub" sec:authorize="hasRole('ROLE_ADMIN')"> 
</li>

但在 spring 我实现了自己的 CustomSecurityExpressionRoot 所以我可以在控制器中使用

@PreAuthorize("hasAccess('PERMISSION')")

可以连接 Thymeleaf 以使用我的 CustomSecurityExpressionRoot?

中的 hasAccess(和其他)方法

我会把逻辑放在单例中 Spring bean:

@Component
public class AccessEvaluator {
    public boolean hasAccess(Authentication authentication, String permission) {
        // implementation
    }
}

然后在 Thymeleaf 代码中:

<li th:if="${@accessEvaluator.hasAccess(#request.userPrincipal, 'PERMISSION')}"> 
</li>

我使用了与发布的答案类似的方法来获得身份验证:

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

@Component
public class AccessEvaluator {

    public boolean hasAccess(String pageName) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        return ((MyUserPrincipal) auth.getPrincipal()).getAccessOnPage(pageName);
    }

}

并如下调用它:

<li th:if="${@accessEvaluator.hasAccess('ACT')}" >
    <p> I have access on ACT page </p>
</li>