使用 Spring Security ACL

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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);
    

【讨论】:

你介意看一下吗? ***.com/questions/21388977/…【参考方案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 - 很高兴能提供帮助。发布示例实现作为此问题的另一个答案。

以上是关于使用 Spring Security ACL的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Oauth、SAML 和 spring-security 的多租户的情况下从 spring-security.xml 中获取错误

Spring security:Spring security 如何在 SessionRegistry 中注册新会话?

未调用 Spring Security j_spring_security_check

使用 spring-session 和 spring-cloud-security 时,OAuth2ClientContext (spring-security-oauth2) 不会保留在 Redis

如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java config

Spring-Security:升级到 Spring-Security 4.1 后,用户名发送为空以进行登录