当前用户对ACL没有权限时,Spring ACL添加ACE

时间:2013-12-02 03:26:40

标签: spring permissions spring-security acl

简短问题:当新用户在我的网站上注册时,我需要为域对象添加读取权限。 Spring ACL使用当前用户的权限进行检查,以查看是否可以添加权限。这将始终失败,因为用户刚刚注册并且没有对他们需要读取权限的对象的权限。有没有办法在某些情况下跳过安全检查?

长问题:我正在处理的网站有一个使用令牌和电子邮件完成的邀请系统。用户A创建组织并成为该组织的所有者。然后,用户A可以通过电子邮件邀请用户B到组织,将发送电子邮件告诉他们注册等。当用户B获得邀请时,他们会注册并查找令牌。此令牌与组织有关系,此时我尝试向用户提供ReadPermission,但我收到错误:

“org.springframework.security.acls.model.NotFoundException:无法为传递的权限和SID找到匹配的ACE”

这种安全检查有办法解决吗?

我需要在多长时间内修改Spring Security才能更改此设置?

1 个答案:

答案 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);