使用Spring(Java)的数据模型和REST控制器的多租户许可模型



我正在寻找用于RESTFUL Web服务和后端数据模型的多租户权限模型的示例。我使用Spring在Java建立了OAuth AS和Restful Web服务。大多数后端都完成了,但是现在我正在建立安全性。我需要的是用户对不同对象具有不同权限的能力。为了争论,可以说有一些公司包含帐户。经过身份验证的用户可以具有以下任何权限:

  • 超级用户 - 一切的全部权利
  • 公司管理权 - 该公司内一个或多个公司和帐户的各种财产的权利。
  • 帐户权利 - 公司中更多帐户之一的权利。

例如,爱丽丝可以是超级管理员。鲍勃只能拥有ACME-USER1的帐户权,但拥有公司管理员的Initech和该公司的所有帐户的权利。Bill只是最终用户,具有对Initech-user2的用户权利。

最初,此概念将应用于REST控制器。我的网络服务看起来像这样:

  • Post/Company->创建公司 ->超级用户
  • get/company/{id} ->获得公司 ->该公司的超级用户和公司管理员
  • POST/COMPANY/{ID}/帐户 ->在公司中创建帐户 ->该公司的超级用户和公司管理员
  • get/company/{id}/account/{acctid} ->获取帐户 ->超级用户,公司管理员和该用户

这个概念也将扩展到数据模型。一家公司说,将具有以下属性,并需要以下权限来修改每个属性:

  • 名称 ->超级管理员
  • contact_name->公司管理员
  • Contact_email->公司管理员
  • max_accounts-超级管理员

用户模型看起来像这样:

  • 名称 ->用户
  • 电子邮件 ->用户
  • 启用 ->公司管理员
  • 配额 ->超级管理员

我创建了由我的OAuth授予的当局,例如:

  • 角色_superadmin
  • 角色_companyadmin-acme
  • 角色_companyadmin-initech
  • 角色_useradmin-acme-user1
  • 角色_useradmin-acme-user2

由于角色不是静态的,所以我不相信我能够在@secured或@preauthorize之类的Java中使用注释。我写了一种将主体,公司和用户作为参数的方法,然后生成所需的角色,并检查用户是否拥有它。我不确定这是最好的做法,还是有"春季"的方法。如前所述,我还希望它适用于我的数据模型。我不想用自己的REST控制器将实体分为多个数据传输对象,并在其中评估了权限。

我还阅读http://www.baeldung.com/role-and-privilege-for-spring-security-registration,其中具有包含特权的角色。我喜欢这个模型,因为我将创建诸如create_company或edit_quota之类的粒度权限。然后这些必须应用于特定对象。

任何实施此类事物或对最佳实践的一般想法的项目的示例将不胜感激。

在春季spel中,您可以在上下文spring Expression语言(SPEL)中收到任何BEAN的参考。豆参考。。

在这种情况下,您可以使用@preauthorize注释。例如:

@Component("accessChecker")
public class AccessChecker {
  public boolean hasAccessToCompany(Long companyId) {
    return checkAccessRightsHere(SecurityContextHolder.getContext().getAuthentication(), companyId);
  }
}  
@Controller
public class CompanyController {
   @RequestMapping("/company/{companyId}")
   @PreAuthorize("@accessChecker.hasAccessToCompany(#companyId)")
   public CompanyDto getCompany(@PathVariable("comapanyId") Long companyId) {
   }
}

最新更新