【问题标题】:Using Spring Security ACL使用 Spring Security ACL
【发布时间】:2014-02-15 21:33:09
【问题描述】:

我正在尝试在我的应用程序中实现 Spring Security ACL。我有很多要使用 ACL 的类。

我在文档中读到 AOP 之前已经成功使用过。这是否意味着所有服务都应该有一个通用接口来针对对象执行 CRUD 以最大限度地重用建议?

或者在服务的save、update、delete方法中手动插入、删除……是否正常?

我无法找到很多关于人们如何使用该框架的示例。

【问题讨论】:

    标签: java spring jakarta-ee spring-mvc spring-security


    【解决方案1】:

    ---- 实体删除监听器(包括级联删除)-----

    package com.acme.model.aspects;
    
    import javax.annotation.PostConstruct;
    import javax.persistence.PreRemove;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    import org.springframework.util.Assert;
    import org.springframework.data.domain.Persistable;
    
    import com.acme.PermissionService;
    
    @Component
    public class ObjectIdentityListener {
    
        private static final Logger LOG = LoggerFactory.getLogger(ObjectIdentityListener.class);
    
        static private PermissionService permissionService;
    
        @Autowired(required = true)
        @Qualifier("permissionService")
        public void setSearchService(PermissionService _permissionService)
        {
            permissionService = _permissionService;
        }
    
        @PreRemove
        public void preRemove(Object object) {
            if(object instanceof Persistable) {
                LOG.info("Deleting object identity for class {} id {} ", persistable.getClass(), persistable.getId());
                permissionService.deleteObjectIdentity((Persistable) object);
            }
        }
    
        @PostConstruct
        public void init() {
            Assert.notNull(permissionService, "'permissionService' is required");
        }
    }
    

    ---- permissionService的删除方法----

    public void deleteObjectIdentity(Persistable persistable) {
        try{
            MutableAcl acl = (MutableAcl) mutableAclService.readAclById(identity(persistable));
            mutableAclService.deleteAcl(acl.getObjectIdentity(), true);
        } catch (NotFoundException e){
            LOG.info("Could not find ACL for target {}", persistable);
        }
    }
    

    【讨论】:

    【解决方案2】:

    这完全取决于您的应用。拥有一个集中的服务层次结构肯定会使为创建/检索/更新/删除方法实现单一安全检查变得更简单。但是您有一个现有的应用程序具有不同的服务,这些服务不一定具有共同的父实现,那么您必须在每个服务方法上添加 ALC 安全注释。

    另一种选择是将 ACL 安全性放在您的 DAO 层上,它工作正常,但由于某种原因感觉不对。恕我直言 DAO 不应该处理诸如安全之类的事情。我花了很多时间处理 Spring Security ACL,现在已经很好地掌握了它,如果您需要任何具体示例,请联系我。

    【讨论】:

    • 当我问这个问题时,我想到的是我应该如何插入/更新/删除 ACL 需要的记录。我在域对象的现有服务中有 CRUD 操作。您需要使 ACL 条目与域对象保持同步,对吗?你是怎么管理的?您是在这些服务方法中添加用于插入/更新/删除的 ACL 代码,还是按照文档建议的那样使用 AOP?有这方面的例子吗?
    • 我知道您可以使用 AOP 进行安全检查,但我还没有看到任何可以为您创建/更新/删除它们的东西。 Spring Security ACL 的 MutableAclService 为您提供了 CRUD ACL 条目所需的所有方法。我围绕 MutableAclService 编写了一个包装类来隐藏一些 ACL 细节,然后从我的父 CRUD 服务中调用它。在 CRUD 服务的保存中,调用 wrapperSercurityService.grantPermission(Object target, Object recipient, Permission permission)。在 delete 方法中,调用 wrapperSercurityService.removePermission(Object target, Object recipient, Permission permission)。
    • 很好,我认为我可以这样做。在我实施它时,我可能还有其他一些问题。谢谢你帮助我;)
    • #1:你如何处理级联?在您的域模型中,您使用 JPA/程序级联。您如何确保删除一个对象也会删除与该域对象的关系的所有 ACL 条目?不是很关键吗?
    • @LuckyLuke - 很高兴能提供帮助。发布示例实现作为此问题的另一个答案。
    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2018-12-21
    • 2013-02-25
    • 2010-12-27
    相关资源
    最近更新 更多