【问题标题】:Thymeleaf Security Dialect - hasPermission()Thymeleaf 安全方言 - hasPermission()
【发布时间】:2018-11-23 04:54:37
【问题描述】:

我们将带有角色和权限的 Spring Security 与 Spring ACL 一起使用。前端由 Thymeleaf(版本 3)呈现。应用程序用户可以拥有具有不同权限的角色或直接访问由 ACL 设置的某些域对象。

后端部分一切正常,但我无法在 Thymeleaf 模板中正确编写 sec:authorize,该模板将结合 hasAuthority()hasPermission() 在一个表达式中。用户可以通过特定角色拥有实体级权限,也可以通过 Spring ACL 拥有实例级权限。

具体例子

我有一个显示受 ACL 保护的域对象的表。我想通过 sec:authorize 来限制某些操作,以检查是否允许当前用户执行此操作。

 <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>

在这两者之间创建逻辑与,因此用户必须同时拥有 - 由特定角色和 ACL 授予的访问权限。

【问题讨论】:

    标签: spring thymeleaf spring-security-acl


    【解决方案1】:

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

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

    但是权限评估器仍然拒绝访问该对象。在 Spring Security 配置类中也需要这样配置:

      @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 {
             ....
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-17
      • 2019-09-12
      • 2017-02-18
      • 2015-12-31
      • 2019-07-02
      • 1970-01-01
      • 2016-03-18
      • 2015-12-18
      • 2017-08-11
      相关资源
      最近更新 更多