如何在Thymeleaf`sec:authorize`属性中使用Spring EL表达式

时间:2017-12-22 18:15:08

标签: java spring spring-mvc spring-security thymeleaf

我有一个用于存储方法安全表达式的类。

public final class MethodSecurityExpressions {
    public static final String USER = "hasRole('USER')";
}

在控制器中,我已经像这样使用它了,

@PreAuthorize(MethodSecurityExpressions.USER)
@GetMapping("path/to/list")
public String list(Model model) {
    return "list";
}

在Thymeleaf模板中,我目前正在执行以下操作,

<ul sec:authorize="hasRole('USER')">
    <li>...</li>
</ul>

但我想做这样的事情,

<ul sec:authorize="#{MethodSecurityExpressions.USER}">
    <li>...</li>
</ul>

我正在使用Spring Boot 1.5.8。我已经阅读了JSP tag library documentationThymeleaf documentation并进行了搜索,但没有找到任何有希望的内容。

是否有人知道这是否可行,或者知道类似的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

sec:authorize属性评估Spring Security Expression。该表达式实际上是在SpringSecurity特定的根对象上计算的Spring EL表达式。因此,适当的解决方案可能如下:

<div sec:authorize="${hasRole('#{T(org.example.MethodSecurityExpressions).USER)}'">
</div>

Class MethodSecurityExpression

package org.example;

public final class MethodSecurityExpressions {
    public static final String USER = "USER";
}

来源:

https://github.com/thymeleaf/thymeleaf-extras-springsecurity https://docs.spring.io/spring/docs/4.3.12.RELEASE/spring-framework-reference/html/expressions.html