MutableAcl.createAcl()与自定义UserDetailsS​​ervice

时间:2017-04-11 20:56:00

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

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

当我调用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”。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

sid表中的ACL_SID列应该只包含用户名,而不是包含其属性的整个用户对象。要创建PrincipalSid的正确实例,请确保至少满足下列条件之一:

  • auth.getPrincipal()返回UserDetails界面的实例。

  • auth.getPrincipal().toString()返回用户名。