Rest API 与客户端分离的多租户数据库

2024-03-05

我有一个带有组合键的多租户数据库

clientId - docId

路由看起来像这样

/api/controller/clientId/docId

对于身份验证,我使用“全局”用户名,例如电子邮件 + 密码,通过 https 在每个请求的 http 标头中发送。用户名显式映射到客户端并可在后端使用。

怎样做才能既休息又安全呢?

  1. 像上面的路由,只需验证根据用户名的 clientId 是否与路由中的相同

or

  1. 更改路由如下,并在保存记录之前从数据库获取 clientId?

    /api/controller/docId

这可能是一个显而易见的问题,但我担心潜在的安全问题。或者选择较短的路线是理所当然的吗?

Thanks!


I think /api/controller/docId可能是最好的主意,或者使用单个代理键来表示 ClientId 和 docId (我的偏好)。

除非您需要允许客户端查看其他客户端资源,否则我会将其隐藏在 URI 方案中,最坏的情况是,它最多可以被视为信息泄漏,但它是多余的,因为您已经对客户端进行了身份验证并知道他们是谁。这也是一项开销,即您仍然必须检查 url 中的客户端 ID 是否映射到请求的用户名和密码,因此您无论如何都需要在每个请求上检索客户端 ID。

如果您了解其他多租户环境的工作原理,例如您可以看到销售人员必须通过安全机制推断客户端,或者很幸运为每个对象/资源拥有唯一的 ID。

我见过的一种方法是将客户端标识符(通常是某种代理键,避免暴露其他用户的数据库 ID!)放在 URL 的根部,例如/api/{clientId}/controller/docId.在多租户环境中,每个资源可能/根据定义对于该客户端来说是唯一的。

有时采用这种方法的原因是,每个客户拥有唯一的 url 有助于缓存... /api/{clientId}/controller/docId 或 /api/controller/{clientId}/docId

关于基本身份验证的简要说明

您的方法没有任何问题,但请考虑...您可以在验证密码和用户名的同时检索客户端 ID,并将其添加为 IPrinciple 上的声明。至少可以在代码中使用它,而无需进一步的数据库查找来找到它(在该请求的生命周期内)。

更进一步...考虑一个两步身份验证机制,其中颁发令牌(遵循正确的用户名和密码),并使用令牌中实际的客户端 ID 作为声明。这样,使用令牌的后续请求意味着您不需要为每个请求回调数据库来验证和检索信息。查看 OAuth 不记名令牌http://self-issued.info/docs/draft-ietf-oauth-v2-bearer.html http://self-issued.info/docs/draft-ietf-oauth-v2-bearer.html(一定要签名)或其他一些方法......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rest API 与客户端分离的多租户数据库 的相关文章

随机推荐

  • Elasticsearch - 每个文档的匹配数

    我使用此查询来搜索字段中出现的短语 query match phrase content my test phrase 我需要计算每个文档的每个短语发生了多少次匹配 如果这可能的话 我考虑过聚合器 但认为它们不满足要求 因为它们会给我整个索
  • 如何在 Nextjs 中切换类并更改 CSS?

    我正在开发一个 Next js 项目 其中菜单打开时显示 p 切换菜单类 我设法做到了这一点 但是当我在 CSS 中添加该类时 它没有考虑这两个类 这是我的代码 成分 import useState from react import st
  • 将不完整的嵌套列表放入矩形 ndarray 中

    在Python 也使用numpy 中 我有一个列表列表的列表 每个列表的长度不同 header1 header2 item1 value1 header1 header2 header3 item2 value2 item3 value3
  • Haskell:最简单的 wai 示例的问题

    我是 Haskell 新手 我正在尝试让 wai 包正常工作 因为我对使用 Haskell 进行 Web 应用程序感兴趣 我尝试从第一个 最简单的例子开始wai http github com snoyberg wai主页 1 LANGUA
  • SQL Server 字符串执行带有输出参数的过程

    如何将输出参数与 String Exec 一起使用 考虑使用 标准 语法进行以下查询 DECLARE testString nvarchar 50 EXEC testProcedure param1 testString OUTPUT SE
  • MSVSP100D.dll 缺少在窗口 8 中与 opencv 2.4.1 配合使用 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有以下场景 我正在尝试在 Wind
  • 使用 Cargo 时如何获得带有调试信息的发布版本?

    以下命令 cargo build 产生一个未优化 build with调试信息 相反 cargo build release 产生一个优化 build without调试信息 有没有一种方法可以产生优化 build with调试信息 我需要
  • Heroku 上的 Radiant 扩展?

    有人有过将 Radiant CMS 扩展实际应用到 Heroku 实例上的经验吗 我尝试删除子模块并将文件添加回来 但运气不太好 Heroku 目前不支持 git 子模块 然而 他们的 优秀的 文档表达了解决这个问题的方法 在这里查看 ht
  • 删除 .svn/pristine 的内容是否安全?

    我正在使用一个大型应用程序 我从我的存储库中签出了该应用程序的大部分内容 svn pristine文件夹 据我了解 原始文件夹包含我的workingCopy目录中的文件副本 话虽如此 删除这些文件可以吗 我真的需要它们吗 我已经备份了文件
  • 如何在 C# 中修改装箱值而不创建新对象?

    如何在 C 中修改装箱值而不创建新对象 例如 如果我有object o 5 我想改变盒装的值5 to 6 我怎样才能做到这一点 The o 6 将在堆上创建一个新对象并将对该对象的引用分配给o 还有其他方法可以更改盒装值吗 你可以自己 拳击
  • 从 ansible 运行 powershell 脚本并注册输出

    我正在尝试运行一个 Powershell 脚本 该脚本在远程 Windows PC 上使用 ansible 从 MSI 文件读取 ProductGUID powershell 在本地工作台上作为 ps1 文件运行 但从 ansible 中它
  • 请求超时并显示代码

    Error Domain NSURLErrorDomain Code 1001 The request timed out UserInfo NSUnderlyingError 0x608000244a70 Error Domain kCF
  • Spring Boot JSF 集成

    环境 雄猫8 春季启动 1 5 JSF 2 2 阿帕奇 MyFaces 春季MVC Code 我正在 Servlet 3 0 环境中集成 Spring Boot 和 JSF 2 2 配置类 JSFConfig java JSF 的配置 Co
  • 无法通用导入Python包

    假设我有以下目录结构 workspace init py ys manage init py manage py ys utils init py project dicts py 现在 假设我需要访问project dicts py in
  • 如何合并多个数组而不减慢编译器速度?

    添加这行代码会使我的编译时间从 10 秒缩短到 3 分钟 var resultsArray hashTagParticipantCodes prefixParticipantCodes asterixParticipantCodes att
  • C# 中引用类型和值类型有什么区别?

    几个月前有人问我这个问题 我无法详细解释 C 中引用类型和值类型有什么区别 我知道值类型是int bool float等 参考类型是delegate interface等等 或者这也是错误的吗 你能用专业的方式给我解释一下吗 你的例子有点奇
  • Windows 8 ARM(A.K.A.)吗? “Windows RT”有可供第三方开发人员使用的 Winapi (win32) 吗?

    Windows 8 for ARM 也称为 Windows RT 它是否具有与 Win32 API 等效的功能 I don t意味着它是否可以运行 Win32 x86 代码 但如果它具有 Win32 API可用的给第三方开发商 是的 ARM
  • Rake 任务只调用一次就执行两次

    我编写了一个非常简单的 rake 任务来尝试找到这个问题的根源 namespace foo do task bar environment do puts RUNNING end end 在控制台执行时rake foo bar输出是 RUN
  • SSIS 格式化货币输出

    在我的输出 CSV 文件中 有 4 列数据类型为货币 我的输出是平面文件 CSV 文件 我希望输出中的每一列都采用以下格式 这并没有发生 输出 CSV 文件中出现实际包含美分的列50 79 no 以以下结尾的列0正在压制0 40 8 零列看
  • Rest API 与客户端分离的多租户数据库

    我有一个带有组合键的多租户数据库 clientId docId 路由看起来像这样 api controller clientId docId 对于身份验证 我使用 全局 用户名 例如电子邮件 密码 通过 https 在每个请求的 http