【问题标题】:Grant permission to existing object identities with Spring Security ACL使用 Spring Security ACL 授予对现有对象身份的权限
【发布时间】:2013-10-14 10:16:58
【问题描述】:

我正在使用 Spring Security ACL 实现,我想知道向现有对象身份的角色/用户(安全身份 - SID)授予新权限的最佳方式是什么。

例如,假设我有以下内容(我主要省略了主键和其他一些列,并简单地通过字符串值引用以提高可读性):

  • ACL_SID:ROLE_TEST
  • ACL_CLASS:test_class
  • ACL_OBJECT_IDENTITY:
    • ID:1
    • object_id_class:test_class
    • object_id_identity:someObjectInstanceId
  • ACL_ENTRY:
    • acl_object_identity:1
    • sid:ROLE_TEST
    • 掩码:CREATE(这将是数据库中的整数)

现在,我想将WRITE 权限授予ROLE_TEST 角色,以访问test_class 类的所有未来和现有对象。对于将来创建的对象,我将简单地检查角色的权限并授予它们。但是现有的对象呢?

Spring 是否提供任何东西来轻松做到这一点,还是我必须编写自己的自定义代码来执行以下操作(这还不错,但如果 Spring 已经提供了这个,我宁愿自己不做):

  1. 检索所有具有我要授予新权限的角色/用户的 SID 以及引用具有适当 object_id_class 的对象身份的 ACL 条目。
  2. 为每个结果创建一个与结果相同的新 ACL 条目,但掩码除外,这将反映新的权限。

【问题讨论】:

    标签: spring spring-security spring-security-acl


    【解决方案1】:

    由于我找不到任何内置的 Spring 支持,我最终得到了以下自定义代码。不是最有效的,但它可以满足我的需要。

    如果有人知道更好的解决方案或有改进以下代码的建议,请告诉我。

    自定义 JDBC ACL 服务以按类型 (acl_class) 检索所有现有对象身份:

    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.security.acls.domain.GrantedAuthoritySid;
    import org.springframework.security.acls.domain.ObjectIdentityImpl;
    import org.springframework.security.acls.domain.PrincipalSid;
    import org.springframework.security.acls.model.ObjectIdentity;
    import org.springframework.security.acls.model.Sid;
    
    import javax.sql.DataSource;
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    public class CustomJdbcAclService {
    
        private final JdbcTemplate jdbcTemplate;
    
        private final static String SELECT_EXISTING_BY_CLASS_AND_SID =
                "SELECT DISTINCT " +
                "acl_object_identity.object_id_identity " +
                "FROM acl_object_identity " +
                "LEFT JOIN acl_entry on acl_entry.acl_object_identity = acl_object_identity.id " +
                "LEFT JOIN acl_class on acl_class.id = acl_object_identity.object_id_class " +
                "LEFT JOIN acl_sid on acl_entry.sid = acl_sid.id " +
                "WHERE acl_class.class = ? && acl_sid.sid = ? && acl_entry.granting = 1";
    
        public CustomJdbcAclService(DataSource dataSource) {
            this.jdbcTemplate = new JdbcTemplate(dataSource);
        }
    
        public List<ObjectIdentity> getExistingObjectIdentities(String type, Sid sid) {
            String sidName = getSidName(sid);
    
            List<Map<String, Object>> results = jdbcTemplate.queryForList(SELECT_EXISTING_BY_CLASS_AND_SID, type, sidName);
            List<ObjectIdentity> oids = new ArrayList<>();
    
            for (Map<String, Object> result : results) {
                oids.add(new ObjectIdentityImpl(type, (Serializable) result.get("object_id_identity")));
            }
    
            return oids;
        }
    
        private String getSidName(Sid sid) {
            String sidName;
    
            if (sid instanceof PrincipalSid) {
                sidName = ((PrincipalSid) sid).getPrincipal();
            } else if (sid instanceof GrantedAuthoritySid) {
                sidName = ((GrantedAuthoritySid) sid).getGrantedAuthority();
            } else {
                throw new IllegalArgumentException("Unsupported implementation of Sid");
            }
            return sidName;
        }
    
    }
    

    我从另一个 ACL 服务调用上述内容:

    public class MyAclService {
    
    public void grantPermissionsToExisting(String type, Sid securityIdentity, Permission... permissions) {
            List<ObjectIdentity> existingOids = customJdbcAclService.getExistingObjectIdentities(type, securityIdentity);
            for (ObjectIdentity oid : existingOids) {
                // grantPermissions() gets the ACL of the object identity and inserts the new ACEs
                grantPermissions(oid, securityIdentity, permissions);
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-02
      • 2011-11-20
      • 2014-02-18
      • 2013-09-30
      • 2014-03-06
      • 1970-01-01
      • 2020-03-27
      相关资源
      最近更新 更多