Thymeleaf 安全方言 - hasPermission()
Thymeleaf Security Dialect - hasPermission()
我们正在使用 Spring 具有角色和权限的安全性以及 Spring ACL。前端由 Thymeleaf(版本 3)呈现。应用程序用户可以具有不同权限的角色或直接访问 ACL 设置的某些域对象。
后端部分一切正常,但我无法在 Thymeleaf 模板中正确编写 sec:authorize,该模板将结合 hasAuthority() 和 hasPermission() 在一个表达式中。用户可以通过特定角色获得实体级权限,也可以通过 Spring ACL 获得实例级权限。
具体例子
我有一个 table,它显示受 ACL 保护的域对象。我想通过 sec:authorize 来限制一些操作,以检查是否允许当前用户执行此操作。
<th:block th:each="securedObject: ${securedObjects}">
<button sec:authorize="hasAuthority('DELETE') OR hasPermission(#securedObject,'ADMINISTRATION')">Delete object</button>
</th:block>
但是 hasPermission 评估由于某种原因在这里不起作用。我根本无法访问那里的本地 securedObject。 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>
在这两者之间创建逻辑与,因此用户必须同时拥有两者 - 由特定角色和 ACL 授予的访问权限。
我终于能够让它工作了。可以使用以下表达式访问迭代中的域对象:
<div sec:authorize="hasPermission(#vars.securedObject,'ADMINISTRATION')">Delete</div>
但是,权限评估器仍然拒绝对该对象的访问。还需要在 Spring 安全配置 class 中这样配置它:
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private PermissionEvaluator permissionEvaluator;
@Override
public void configure(WebSecurity web) throws Exception {
DefaultWebSecurityExpressionHandler handler = new
DefaultWebSecurityExpressionHandler();
handler.setPermissionEvaluator(permissionEv);
web.expressionHandler(handler);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
....
}
我们正在使用 Spring 具有角色和权限的安全性以及 Spring ACL。前端由 Thymeleaf(版本 3)呈现。应用程序用户可以具有不同权限的角色或直接访问 ACL 设置的某些域对象。
后端部分一切正常,但我无法在 Thymeleaf 模板中正确编写 sec:authorize,该模板将结合 hasAuthority() 和 hasPermission() 在一个表达式中。用户可以通过特定角色获得实体级权限,也可以通过 Spring ACL 获得实例级权限。
具体例子
我有一个 table,它显示受 ACL 保护的域对象。我想通过 sec:authorize 来限制一些操作,以检查是否允许当前用户执行此操作。
<th:block th:each="securedObject: ${securedObjects}">
<button sec:authorize="hasAuthority('DELETE') OR hasPermission(#securedObject,'ADMINISTRATION')">Delete object</button>
</th:block>
但是 hasPermission 评估由于某种原因在这里不起作用。我根本无法访问那里的本地 securedObject。 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>
在这两者之间创建逻辑与,因此用户必须同时拥有两者 - 由特定角色和 ACL 授予的访问权限。
我终于能够让它工作了。可以使用以下表达式访问迭代中的域对象:
<div sec:authorize="hasPermission(#vars.securedObject,'ADMINISTRATION')">Delete</div>
但是,权限评估器仍然拒绝对该对象的访问。还需要在 Spring 安全配置 class 中这样配置它:
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private PermissionEvaluator permissionEvaluator;
@Override
public void configure(WebSecurity web) throws Exception {
DefaultWebSecurityExpressionHandler handler = new
DefaultWebSecurityExpressionHandler();
handler.setPermissionEvaluator(permissionEv);
web.expressionHandler(handler);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
....
}