具有多个用户的 Spring Boot REST 服务[关闭]

Posted

技术标签:

【中文标题】具有多个用户的 Spring Boot REST 服务[关闭]【英文标题】:Spring boot REST service with multiple users [closed] 【发布时间】:2016-11-29 19:31:38 【问题描述】:

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

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

目前,我有一个简单的应用程序设置,其中包含数据库架构、spring-JPAspring-data-rest 公开所有存储库。

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

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

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

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

编辑:正如 cmets 中所指出的,对于这项任务来说,使用多租户可能有点过头了,因为我只需要在实体级别上分离用户。对于如何在 Spring Boot 和 JPA 中执行此操作的任何提示,我将很高兴,因为我没有找到有关此主题的教程。

【问题讨论】:

您不需要多租户,您只需在数据库查询中为当前用户添加一个条件,这些条件在调用这些 REST 端点时执行。 @dunni 你可能是对的,我更新了我的答案。不过,我仍在努力如何实现这样的事情 看看这个链接是否有帮助。 ***.com/questions/23640487/… 【参考方案1】:

关于如何实现您所描述的内容的解释并不多,尽管这似乎是一个常见问题。希望 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 的情况下实现所需行为的最佳方式。

【讨论】:

谢谢。我非常喜欢这里建议的方法:***.com/questions/30834138/… -> @PreAuthorize("isFullyAuthenticated && (#userName==principal.username)") 因为我不喜欢在代码中硬编码任何 SQL 查询。我还计划使用一些安全性(可能是 OAuth2),所以我需要它完全兼容。 @Smajl 我在回答中引用了该选项,但表示它有很大的缺点,因为您需要以编程方式处理结果,而不是动态调整查询,从而显着缩短响应时间,尤其是对于复杂的模式.在您提供的链接上查看此评论:***.com/questions/30834138/… 你说得对,我会试试看它是否适合我。

以上是关于具有多个用户的 Spring Boot REST 服务[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

您将如何使用 Spring Boot 处理仅具有可选查询参数的 REST API?

具有多个数据源 Oracle 和 H2 的 Spring Boot

Spring-boot REST 安全配置角色无法正常工作

Spring Security 具有不同用户详细信息的多个 HTTPSecurity 服务在 Spring Boot 中不起作用

使用 Spring Boot 的多个 REST 调用

Spring Boot Rest 服务下载包含多个文件的 zip 文件