【发布时间】:2017-05-16 23:56:26
【问题描述】:
Thymeleaf 3.0 可以做到这一点:
/*[# th:if="${user.admin}"]*/
alert('Welcome admin');
/*[/]*/
但这不起作用:
/*[# sec:authorize="hasAnyRole('ROLE_ADMIN)"]*/
alert('Welcome admin');
/*[/]*/
这真的不可能还是我做错了什么?
我使用 Spring Security 4.1。
转义表达式解析的一些背景资料:https://github.com/thymeleaf/thymeleaf/issues/395
编辑 1
Daniel Fernández 在我最初的问题中发现了一个缺失的单引号。
可惜加了之后还是不行。
表达式被解析,因为它从生成的 html/javascript 中消失了。
但是即使我没有登录,或者即使我已经登录并且我将检查更改为sec:authorize="hasRole('ROLE_ADMIN123'),也会执行 document.writeln()
<script type="text/javascript" th:inline="javascript">
/*[# sec:authorize="hasRole('ROLE_ADMIN')"]*/
document.writeln("ADMIN !!!");
/*[/]*/
</script>
编辑 2
这是我的解决方法until further notice:
在@Service 中创建一个方法来检查用户是否具有所需的角色:
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Service;
@Service
public class UtilService {
public boolean hasAnyRole(HttpServletRequest req, String... roles) {
for (final String role : roles) {
if (req.isUserInRole(role)) {
return true;
}
}
return false;
}
}
并在JavaScript 块中像这样使用它:
<script type="text/javascript" th:inline="javascript">
/*[# th:if="${@utilService.hasAnyRole(#httpServletRequest, 'ROLE_ADMIN')}"]*/
...
/*[/]*/
</script>
【问题讨论】:
标签: javascript java spring-security thymeleaf