Thymeleaf和Spring Security - 自定义SpEL表达式

问题描述 投票:2回答:2

我正在使用Thymeleaf的弹簧安全装置。在HTML代码中,我正在检查用户角色:

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

但在春天我实现了自己的CustomSecurityExpressionRoot,所以我可以在控制器中使用例如

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

有可能连接Thymeleaf能够使用hasAccess中的CustomSecurityExpressionRoot(和其他)方法吗?

spring spring-security thymeleaf spring-el
2个回答
2
投票

我会把逻辑放在一个单独的Spring bean中:

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

然后在Thymeleaf代码中:

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

1
投票

我使用类似于发布的答案的方式获得身份验证:

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>
© www.soinside.com 2019 - 2024. All rights reserved.