具有多个用户的Spring Boot REST服务

时间:2016-07-26 08:42:26

标签: rest jpa spring-boot multi-tenant

首先,我花了一些时间思考这个问题是否属于SO,所以如果您认为它更适合其他Stack Exchange网站,请随时推荐或迁移。

我正在编写一个REST应用程序,它可以注册新用户并允许现有用户互相交流(例如,你可以想象一个论坛或一个简约的社交网络)。

目前,我有一个简单的应用程序设置,其中包含数据库架构, spring-JPA spring-data-rest ,可以显示所有存储库。

但是,所有用户现在都可以从服务器访问所有资源。我希望用户只能看到自己的实体:例如转到/api/user/messages

我也会在应用程序中使用一些安全性,可能是OAuth2,所以我需要它兼容。

我已经阅读了一些有关此主题的文章和SO问题,并决定多租户可能是我的问题的解决方案。通常,这些文章对每个客户端和总数较少的客户端使用单独的数据库,因此我很好奇它是否实际上是用于系统中的大量用户。我希望所有用户都能与他们的记录共享数据库并使用相同的模式。

是否有一些关于Spring引导和共享数据库模式的主题教程?或者是否有更好的方法来解决这个问题?我会很高兴任何提示!

编辑:正如评论中所指出的,使用多租户可能对此任务来说太过分了,因为我只需要在实体级别上分离用户。我很高兴有任何提示如何在Spring boot和JPA中做到这一点,因为我没有找到关于这个主题的教程。

1 个答案:

答案 0 :(得分:3)

关于如何实现您所描述的内容,即使它似乎是一个常见问题,也没有多少解释。希望Spring团队能够解决这个非常常见的用例。以下是我所看到的两种可能的解决方案,其中第二种是我使用的解决方案。

复杂解决方案

Spring Security ACL

简单解决方案

@Query Method Security Expressions

示例:

@Query("select m from Message m where m.user like ?#{hasRole('ADMIN') ? '%' : authentication.name}")

@Query方法通常用于定义更复杂的查询,而不能轻易地在方法名称查询创建中编写,这是Spring Data的标准机制。

您可以在@Query方法中添加安全逻辑,该方法可以根据用户的身份返回不同的结果。

如果用户具有ADMIN角色,上面的示例将返回所有消息,但如果不是,则它将仅返回自己的消息。这具有查询优化的额外好处。您可以选择所有记录,然后以编程方式过滤掉用户无法访问的记录,但对于大型查询,这将成为瓶颈。这将根据请求数据的人在运行时调整查询。我发现它是实现所需行为的最佳方式,而无需实现完整的ACL。