面对Spring Security的DefaultPermissionGrantingStrategy非常令人困惑的行为。请看下面的测试并向我解释一下,为什么它会失败并显示org.springframework.security.acls.model.NotFoundException:无法为传递的权限和SID找到匹配的ACE
@Test
public void testDefaultPermissionGrantingStrategy() {
Authentication auth = new TestingAuthenticationToken("joe", "ignored", "SYSTEM");
SecurityContextHolder.getContext().setAuthentication(auth);
//create ACL which says: "admin" can "ADMINISTER" a secured object with id 9999
MutableAcl acl = new AclImpl(
new ObjectIdentityImpl(Object.class, 9999)
, 1
, new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("SYSTEM"))
, new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger()) // <-- here's the core logic
, null
, null
, false
, new PrincipalSid("owner"));
Sid admin = new GrantedAuthoritySid("admin");
acl.insertAce(0, BasePermission.ADMINISTRATION, admin, true);
//check if such ACL allows "admin" user "READ" access
assertTrue(acl.isGranted(Arrays.asList(BasePermission.READ), Arrays.asList(admin), false));
}
让我澄清一下我在这次测试中做了什么以及我期待什么。我为某些安全对象(id = 9999)创建了访问控制列表。之后我添加了“admin”SID“管理”该对象的权限。就是这个。
我的期望是这个 SID 也应该能够“读取”安全对象,因为显然“读取”访问比“管理”访问弱得多。不幸的是,Spring Security DefaultPermissionGrantingStrategy 有不同的意见,测试失败。
我在这里缺少什么,有人可以解释一下吗?
提前致谢!
附注使用Spring 3.2.5-RELEASE
最佳答案
我知道这是一个旧答案,但 Spring ACL 在过去几年中并没有太大变化。
看看这个 AclAuthorizationStrategyImpl.securityCheck(...)源代码,请注意 DefaultPermissionGrantingStrategy 检查进行更改的用户是否是 ACL 记录的所有者,如果不是,它继续检查进行更改的用户是否是 ACL 记录的成员配置的用户组。
配置的用户组可以与所有其他用户组分开,并且可以像这样配置:
@Bean
public AclAuthorizationStrategy aclAuthorizationStrategy() {
return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMIN"));
}
如果您省略此配置,或者您的配置与包含尝试进行 ACL 更改的用户(不是 ACL 所有者)的实际组名称不匹配,您将收到有点不明确的消息 无法为传递的权限和SID找到匹配的ACE
关于spring-security - Spring 安全: Unable to locate a matching ACE for passed permissions and SIDs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33297269/