Thymeleaf安全方言 - hasPermission()

时间:2018-06-13 14:43:57

标签: spring thymeleaf spring-security-acl

我们将Spring Security与Spring ACL一起使用角色和特权。 Thymeleaf(版本3)提供了前端。应用程序用户可以具有不同权限的角色,也可以直接访问ACL设置的某个域对象。

在后端部分,所有内容都按预期工作,但我无法写入sec:在Thymeleaf模板中正确授权,该模板将结合 hasAuthority() hasPermission()在一个表达式中。用户可以通过Spring ACL获得某个角色或实例级别权限的实体级别权限。

具体示例

我有一个表格,显示ACL保护的域对象。我希望通过sec限制一些操作:授权检查,是否允许当前用户执行此操作。

 <th:block th:each="securedObject: ${securedObjects}">
        <button sec:authorize="hasAuthority('DELETE') OR hasPermission(#securedObject,'ADMINISTRATION')">Delete object</button>
 </th:block>

但是,由于某些原因,hasPermission评估不起作用。我根本无法访问那里的本地secureObject。 ACL安全性将其视为null并拒绝访问。我尝试了不同的语法(hasPermission($ {securedObject},'ADMINISTRATION')等,没有任何成功。

有趣的是,它正确使用sec:authorize-acl正确:

 <button sec:authorize-acl="${securedObject} :: 'ADMINISTRATION'">
 </button>

但是,当以这种方式编写时,无法将其与实体级别的权限(hasRole())相结合,因此:

 <button sec:authorize-acl="${securedObject} :: 'ADMINISTRATION'" sec:authorize="hasRole('DELETE')">
 </button>

在这两者之间创建逻辑AND ,因此用户必须同时拥有 - 由某个ROLE和ACL授予的访问权限。

1 个答案:

答案 0 :(得分:0)

我终于能够让它发挥作用了。可以使用以下表达式访问迭代中的域对象:

reachable(A->B) => true
reachable(A->B) => false
reachable(A->H) => true
reachable(H->A) => false

然而,Permission评估者仍然拒绝访问该对象。它还需要以这种方式在Spring Security配置类中进行配置:

 <div sec:authorize="hasPermission(#vars.securedObject,'ADMINISTRATION')">Delete</div>