当前位置: 首页 > 知识库问答 >
问题:

使用Spring SecurityACL向现有对象标识授予权限

孔鸿云
2023-03-14

我正在使用SpringSecurityACL实现,我想知道为角色/html" target="_blank">用户(securityIdentity-SID)授予现有对象标识的新权限的最佳方式是什么。

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

  • ACL\u SID:角色\u测试
  • acl\u对象\u标识:1

现在,我想为类TEST\u类的所有未来和现有对象授予角色role\u TEST的权限WRITE。对于将来创建的对象,我只需检查角色的权限并授予它们。但是现有的对象呢?

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

  1. 使用我想要授予新权限的角色/用户的SID检索所有ACL条目,并引用具有适当的object_id_class的对象标识。
  2. 对于每个结果,创建一个新的ACL条目,该条目与结果相同,除了掩码,它将反映新的权限。

共有1个答案

阎丰
2023-03-14

由于在Spring中找不到对此的任何内置支持,因此我最终得到了以下自定义代码。不是最有效的,但它做了我需要它做的。

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

用于按类型检索所有现有对象标识的自定义JDBC ACL服务(ACL_类):

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);
        }
    }

}
 类似资料:
  • 本文向大家介绍oauth 授权码授予,包括了oauth 授权码授予的使用技巧和注意事项,需要的朋友参考一下 示例 第1步 第2步 资源

  • 当我使用JAVA API将数据放入hdfs时,我必须为hdfs目标目录提供许可。我尝试了以下代码: 我有以下错误

  • 我已经创建了自己的android。这样我就可以使用隐藏的API调用“DisplayManager.connectWifiDisplay()”。 当我运行应用程序并调用该方法时,在通过Wifi Direct连接到显示器后, 我得到以下例外: java.lang.SecurityException:连接到wifi显示器所需的权限:用户10105和当前进程都没有android.Permission.CO

  • 我在*上运行命令< code >授予所有权限。*到由“root”标识的“root”@“%”; 并且它不断显示以下错误 11: 43:51向“root”标识的“root“@”%“授予所有权限。错误代码:1045。拒绝用户“root‘@”%的访问(使用密码:YES)0.00045秒 我还检查了Mysql上的User表,如下所示。 我不知道这是怎么回事?: 不重新安装MySQL怎么解决这个问题?(因为,

  • 我想在不使其成为管理员的情况下授予用户数据库的所有权限。我想这样做的原因是目前DEV和PROD是同一集群上的不同DBs,因此我不希望用户能够更改生产对象,但它必须能够更改DEV上的对象。 我尝试了: 但它似乎没有给予任何许可。 然后我尝试: 它似乎允许我创建对象,但不允许我在属于其他用户的模式上查询\delete对象 我可以继续通过给予用户USAGE权限MY_SCHEMA但它会抱怨没有在表上的权限

  • 问题内容: 我知道我可以使用视图来授予对表中属性子集的访问权限。但是,如何只授予对特定元组的访问权限?假设我有一个注册学生的表格,一个用户名属性,然后是诸如degree_status之类的其他名称,我如何授予访问权限,以便用户A只能从该表中选择一个与用户名A相对应的元组?我有一个数据库考试,正在研究一些以前的论文,遇到了这个问题,但是我不知道该如何回答,我在《 Dtabase System:数据库