简短问题:当新用户在我的网站上注册时,我需要为域对象添加读取权限。 Spring ACL使用当前用户的权限进行检查,以查看是否可以添加权限。这将始终失败,因为用户刚刚注册并且没有对他们需要读取权限的对象的权限。有没有办法在某些情况下跳过安全检查?
长问题:我正在处理的网站有一个使用令牌和电子邮件完成的邀请系统。用户A创建组织并成为该组织的所有者。然后,用户A可以通过电子邮件邀请用户B到组织,将发送电子邮件告诉他们注册等。当用户B获得邀请时,他们会注册并查找令牌。此令牌与组织有关系,此时我尝试向用户提供ReadPermission,但我收到错误:
“org.springframework.security.acls.model.NotFoundException:无法为传递的权限和SID找到匹配的ACE”
这种安全检查有办法解决吗?
或
我需要在多长时间内修改Spring Security才能更改此设置?
答案 0 :(得分:0)
在阅读spring docs时找到了答案。您可以使用Runnable和DelegatingSecurityContextExecutor以其他用户身份运行所需的调用。
User newUser = getCurrentUser();
User notOriginalUser = accountsService.findUserById(someId);
SecurityContext context = SecurityContextHolder.createEmptyContext();
Authentication authentication = new UsernamePasswordAuthenticationToken(notOriginalUser, "doesnotmatter", authoritiesList);
context.setAuthentication(authentication);
SimpleAsyncTaskExecutor delegateExecutor = new SimpleAsyncTaskExecutor();
DelegatingSecurityContextExecutor executor = new DelegatingSecurityContextExecutor(delegateExecutor, context);
class PermissionRunnable implements Runnable {
String u;
Organization o;
PermissionRunnable(Organization org, String username) {
o = org;
u = username;
}
public void run() {
permissionsService.setReadableByPrincipal(o, new PrincipalSid(u));
}
}
Runnable originalRunnable = new PermissionRunnable(org, newUser.getUsername());
executor.execute(originalRunnable);