Java 使用Spring安全ACL

Java 使用Spring安全ACL,java,spring,jakarta-ee,spring-mvc,spring-security,Java,Spring,Jakarta Ee,Spring Mvc,Spring Security,我正在尝试在我的应用程序中实现Spring安全ACL。我有许多类要在其上使用ACL 我在文档中读到,AOP以前已经成功地使用过。这是否意味着所有服务都应该有一个公共接口,用于对对象执行CRUD,以最大限度地重用advise 或者手动插入、删除……是否正常。。。在服务的保存、更新、删除方法中 我找不到很多关于人们如何使用框架的例子。这取决于你的应用程序。拥有集中的服务层次结构肯定会使创建/检索/更新/删除方法实现单一安全检查变得更简单。但是你有一个现有的应用程序,它有不同的服务,不一定有一个共同的

我正在尝试在我的应用程序中实现Spring安全ACL。我有许多类要在其上使用ACL

我在文档中读到,AOP以前已经成功地使用过。这是否意味着所有服务都应该有一个公共接口,用于对对象执行CRUD,以最大限度地重用advise

或者手动插入、删除……是否正常。。。在服务的保存、更新、删除方法中


我找不到很多关于人们如何使用框架的例子。

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

另一个选择是将ACL安全性放在DAO层上,它工作得很好,但由于某些原因,感觉不太对劲。我和道不应该处理安全之类的事情。我已经花了很多时间处理Spring Security ACL,现在它已经有了一个很好的处理方法,如果您需要任何具体的示例,请与我联系。

----用于实体删除的侦听器(包括级联删除)-----

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


当我问这个问题时,我想到的是我应该如何插入/更新/删除ACL需要的记录。我在域对象的现有服务中有CRUD操作。您需要保持ACL条目与域对象同步,对吗?你是怎么做到的?您是在这些服务方法中添加用于插入/更新/删除的ACL代码,还是按照文档建议使用AOP?有关于这方面的例子吗?我知道你可以使用AOP进行安全检查,但我没有看到任何可以为你创建/更新/删除它们的东西。Spring Security ACL的MutableACL服务为您提供了CRUD ACL条目所需的所有方法。我围绕MutableAclService编写了一个包装类来隐藏一些ACL细节,然后从父CRUD服务调用它。在CRUD服务的保存中,调用WrapperSecurityService.grantPermission(对象目标、对象收件人、权限)。在delete方法中,调用WrapperSecurityService.removePermission(对象目标、对象收件人、权限权限)。很好,这就是我认为可以做到的。在实施过程中,我可能还有一些其他问题。谢谢你帮助我;)#1:您如何处理级联?在域模型中,您以编程方式使用JPA/级联。如何确保删除对象同时删除与该域对象相关的所有ACL条目?这不是很重要吗?@LuckyLuke-很高兴能帮上忙。发布了示例实现作为这个问题的另一个答案。您介意看一下吗?
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");
    }
}
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);
    }
}