当前位置: 首页 > 知识库问答 >
问题:

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

缪坚诚
2023-03-14

我正在寻找RESTful web服务的多租户权限模型和后端数据模型的示例。我使用Spring在Java中构建了一个OAUTH AS和RESTful web服务。大部分后端都已完成,但现在我正在构建安全性。我需要的是用户对不同对象拥有不同权限的能力。为了便于论证,假设有一些公司包含帐户。经过身份验证的用户可以拥有以下任何权限:

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

例如,Alice可以是超级管理员。Bob可以仅拥有ACME-USER1的帐户权限,但拥有INITECH和该公司中所有帐户的公司管理员权限。Bill只是对INITECH-USER2拥有用户权限的最终用户。

最初,这个概念将应用于REST控制器。我的web服务如下所示:

  • 发布 /company-

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

  • 名称-

用户模型如下所示:

  • 名称-

我创建了由我的OAUTH授予的权限,例如:

  • 角色\u超级管理员

由于角色不是静态的,我不相信我能够在Java中使用诸如@Secured或@PreAuthorize之类的注释。我编写了一个方法,该方法将主体、公司和用户作为参数,然后生成所需的角色,并检查用户是否拥有该角色。我不确定这是不是最好的做法,或者是否有一种“Spring-y”的方法来做到这一点。如前所述,我还希望将此应用于我的数据模型。我不希望必须将实体拆分为多个数据传输对象,并使用其自己的REST控制器来评估权限。

我还阅读了http://www.baeldung.com/role-and-privilege-for-spring-security-registration,其中它们具有包含权限的角色。我喜欢这个模型,因为我会创建像CREATE_COMPANY或EDIT_QUOTA这样的粒度权限。然后这些必须应用于特定对象。

任何实现这样的项目示例或关于最佳实践的一般想法都将受到赞赏。

共有1个答案

滑乐逸
2023-03-14

在Spring SpEL中,您可以接收上下文Spring表达式语言(SpEL)中任何bean的引用。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) {

   }
}
 类似资料:
  • 我们目前的开发基于多租户中的鉴别器模型。以下是我们目前正在使用的技术堆栈, Spring3.1.1。释放 Hibernate4.1.6。最终版本 我们通过在每个表中分别保留一列来维护租户id。创建会话时租户id筛选器。 示例模型类。 这是会话工厂的配置 租户基础会话工厂 示例服务类 示例DAO类 我想知道有没有一种方法可以通过这个数据库事务鉴别器模型获得spring事务支持?另一件事是,我想知道将

  • 我正在构建一个应用程序,它应该服务于多个租户,并存储他们非常敏感的数据。每个租户都有多个用户。我的后端堆栈是用spring boot Hibernate5构建的。我希望hibernate处理多租户问题,所以我有两个问题要问专家: 如果我使用的是每租户模式范式,如何在登录时将用户名与租户关联?每个租户都有自己的用户表,那么我如何知道用户名属于哪个租户呢? 在注册时,什么是正确的方法来动态创建新模式?

  • 我认为为每个租户创建一个Redis实例是一个很好的解决方案。 我有一个包含租户id和Redisendpoint的映射,这是专用于这个租户的。 地图数据如下所示:

  • 英文原文:http://emberjs.com/guides/controllers/representing-multiple-models-with-arraycontroller/ Ember.ArrayController用于代表一组模型。通过在路由的setupController方法中设置ArrayController的model属性,来指定其代表的模型。 可以将ArrayControl

  • 在本节中,您将创建一个新的MoviesController类,并在这个Controller类里编写代码来取得电影数据,并使用视图模板将数据展示在浏览器里。 在开始下一步前,先Build一下应用程序(生成应用程序)(确保应用程序编译没有问题) 在解决方案上,用鼠标右键单击Controller文件夹,点击新增,再选择Controller。 在Scaffold新增对话框,选择MVC 5 Controll

  • 在web应用程序(基于laravel 5.3的mysql)中,有三个主要模型:、和和许多其他模型(、等)有管理器(另一个在顶层)。 属于。部门组成等级制度。用户有一些角色,例如,允许他查看他的部门和他的部门下面的所有部门的任务。 例如,零级部门的用户可以看到系统中的所有任务。