我目前正在尝试将 Spring 的 ACL 实现到我现有的应用程序中。可悲的是,我被困在一个特定点,这似乎是由我的 UserDetailsService 引起的。
当我像这样调用类的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”。有更好的解决方案吗?