0

我目前正在尝试将 Spring 的 ACL 实现到我现有的应用程序中。可悲的是,我被困在一个特定点,这似乎是由我的 UserDetailsS​​ervice 引起的。

当我像这样调用类的createAcl()函数 时,问题/错误如下MutableAcl

public void addPermission(long objectId, Sid recipient, Permission permission, Class clazz) {
    MutableAcl acl;
    ObjectIdentity oid = new ObjectIdentityImpl(clazz.getCanonicalName(), objectId);

    try {
        acl = (MutableAcl) mutableAclService.readAclById(oid);
    } catch (NotFoundException nfe) {
        acl = mutableAclService.createAcl(oid);
    }

    acl.insertAce(acl.getEntries().size(), permission, recipient, true);
    mutableAclService.updateAcl(acl);
}

ObjectIdentity如果此类实例还没有,则在此函数内部创建一个新的。为此目的PrincipalSid从当前对象创建一个新对象(保存在 ACL_SID 表中)。Authentication像这样:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
PrincipalSid sid = new PrincipalSid(auth);
this.createObjectIdentity(objectIdentity, sid);

当它尝试将条目保存到ACL_SID定义如下的表中时会出现问题:

CREATE TABLE IF NOT EXISTS ACL_SID (
  id BIGSERIAL NOT NULL PRIMARY KEY,
  principal BOOLEAN NOT NULL,
  sid VARCHAR(100) NOT NULL,
  CONSTRAINT UNIQUE_UK_1 UNIQUE(sid,principal)
);

如您所见,它sid是一个 100 个字符的 VARCHAR。我的自定义 User 类包含一些属性,这些属性大多转换为字符串表示形式,这导致PrincipalSid长度超过 100 个字符。现在第一个明显的解决方案是只更改toString方法以仅返回最基本的值。对我来说,这仍然有点“hacky”。有更好的解决方案吗?

4

1 回答 1

1

表中的sidACL_SID应该只包含用户名,而不是包含其属性的整个用户对象。要创建 的正确实例PrincipalSid,请确保以下至少一项为真:

于 2017-04-12T06:59:17.970 回答