Spring 使用多个用户启动 REST 服务
Spring boot REST service with multiple users
首先,我花了一些时间思考这个问题是否属于SO,所以如果您认为它更适合其他Stack Exchange网站,请随时推荐或迁移。
我正在编写一个 REST 应用程序,它将能够注册新用户并允许现有用户相互交互(例如,您可以想象一个论坛或一个简约的社交网络)。
目前,我有一个带有数据库架构的简单应用程序设置,spring-JPA 和 spring-data- rest 公开所有存储库。
但是,所有用户现在都可以从服务器访问所有资源。我希望用户只看到他自己的实体:例如转到 /api/user/messages
.
我还将在应用程序中使用一些安全性,可能是 OAuth2,因此我需要它兼容。
我阅读了一些有关该主题的文章和 SO 问题,并决定 多租户 可能是解决我的问题的方法。通常情况下,这些文章针对每个客户端和较少数量的客户端使用单独的数据库,所以我很好奇它是否真的意味着用于系统中的大量用户。我希望所有用户与其记录共享数据库并使用相同的模式。
是否有关于 spring 引导和共享数据库架构的主题教程?还是有更好的方法来解决这个问题?我很乐意提供任何提示!
编辑:正如评论中所指出的那样,使用多租户对于这项任务来说可能有点矫枉过正,因为我只需要在实体级别分离用户。我很高兴得到任何提示如何在 Spring 引导和 JPA 中执行此操作,因为我没有找到有关此主题的教程。
关于如何实现您所描述的内容的解释并不多,尽管这似乎是一个常见问题。希望 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
方法中添加安全逻辑,该方法可以根据用户是谁 return 不同的结果。
如果用户具有 ADMIN 角色,以上示例将 return 所有消息,但如果不是,则将 return 仅他们自己的消息。这具有查询优化的额外好处。您可以 select 所有记录,然后以编程方式过滤掉用户无权访问的记录,但对于大型查询,这会成为瓶颈。这将根据请求数据的人在运行时调整查询。我发现这是在不实施完整 ACL 的情况下实现所需行为的最佳方式。
首先,我花了一些时间思考这个问题是否属于SO,所以如果您认为它更适合其他Stack Exchange网站,请随时推荐或迁移。
我正在编写一个 REST 应用程序,它将能够注册新用户并允许现有用户相互交互(例如,您可以想象一个论坛或一个简约的社交网络)。
目前,我有一个带有数据库架构的简单应用程序设置,spring-JPA 和 spring-data- rest 公开所有存储库。
但是,所有用户现在都可以从服务器访问所有资源。我希望用户只看到他自己的实体:例如转到 /api/user/messages
.
我还将在应用程序中使用一些安全性,可能是 OAuth2,因此我需要它兼容。
我阅读了一些有关该主题的文章和 SO 问题,并决定 多租户 可能是解决我的问题的方法。通常情况下,这些文章针对每个客户端和较少数量的客户端使用单独的数据库,所以我很好奇它是否真的意味着用于系统中的大量用户。我希望所有用户与其记录共享数据库并使用相同的模式。
是否有关于 spring 引导和共享数据库架构的主题教程?还是有更好的方法来解决这个问题?我很乐意提供任何提示!
编辑:正如评论中所指出的那样,使用多租户对于这项任务来说可能有点矫枉过正,因为我只需要在实体级别分离用户。我很高兴得到任何提示如何在 Spring 引导和 JPA 中执行此操作,因为我没有找到有关此主题的教程。
关于如何实现您所描述的内容的解释并不多,尽管这似乎是一个常见问题。希望 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
方法中添加安全逻辑,该方法可以根据用户是谁 return 不同的结果。
如果用户具有 ADMIN 角色,以上示例将 return 所有消息,但如果不是,则将 return 仅他们自己的消息。这具有查询优化的额外好处。您可以 select 所有记录,然后以编程方式过滤掉用户无权访问的记录,但对于大型查询,这会成为瓶颈。这将根据请求数据的人在运行时调整查询。我发现这是在不实施完整 ACL 的情况下实现所需行为的最佳方式。