我目前正在尝试将Spring的ACL实现到我现有的应用程序中。 可悲的是,我陷入了一个特定的问题,这似乎是由我的UserDetailsService引起的。
当我调用window
函数时,问题/错误如下
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)
);
是一个包含100个字符的VARCHAR。我的自定义User类包含一些主要转换为String表示的属性,这导致sid
超过100个字符。现在,第一个明显的解决方案是仅将PrincipalSid
方法更改为仅返回最基本的值。
对我来说,这似乎有点“hacky”。有更好的解决方案吗?
答案 0 :(得分:1)
sid
表中的ACL_SID
列应该只包含用户名,而不是包含其属性的整个用户对象。要创建PrincipalSid
的正确实例,请确保至少满足下列条件之一:
auth.getPrincipal()
返回UserDetails界面的实例。
auth.getPrincipal().toString()
返回用户名。