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

时间:2017-12-29 12:12:54

标签: spring spring-security thymeleaf spring-el

我使用Thymeleaf进行弹簧安全保护。 在html代码中,我正在检查用户角色:

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

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

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

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

2 个答案:

答案 0 :(得分: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 :(得分: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>