【问题标题】:What is the best approach to design database with external users, groups and permissions?设计具有外部用户、组和权限的数据库的最佳方法是什么?
【发布时间】:2020-04-07 15:02:15
【问题描述】:

我们正在从后端移除用户、用户组和权限模型,以支持 Auth0。 我们的第一个想法是从数据库中删除用户、组和权限表,并用 varchar 字段替换相关的外键。然后,在此字段中,我们将输入我们从 JWT 中的 Auth0 获得的 ID(指向我们的数据库中不存在的东西)。

这是好方法吗?我不知何故觉得必须有更多“关系”的方式来做到这一点。

【问题讨论】:

    标签: database database-design oauth-2.0 openid-connect auth0


    【解决方案1】:

    通常 OAuth 不会为您执行所有权限检查。相反,它为您提供了让用户登录和颁发 + 验证令牌的通用机制。

    在大多数现实世界的架构中,您还需要在后端管理第二级授权 - 使用特定于域的用户数据来获取角色、权限等。

    我的一些文章可能会有所帮助:

    【讨论】:

    • 是的,我们知道我们需要实施权限检查。但是我们将在令牌中获得权限列表(用户所属的组列表以及每个组的权限列表)。这样我们的数据库中实际上不需要权限和组
    • 好的 - 在某些设置中可以完美运行。但是,如果您有多个具有不同组/权限的 API,则可能难以扩展,因为不同的 API 通常需要共享相同的访问令牌策略。每当您更改 API 1 的权限时,您还需要推出对 Auth0 权限数据的更改。在某些情况下,API 1 的更改可能与 API 2 发生冲突。
    • 就数据库字段而言,我会在您的后端至少保留一个小型用户表——它使用数据库代理主键。还可以考虑将令牌的用户 ID 作为唯一约束添加到架构中。给定访问令牌,您将能够查找用户的个性化数据。我上面的用户数据管理页面解释了这一点。
    【解决方案2】:

    这里是 Auth0 社区经理 Dan,

    在这种情况下,您可以利用 RBAC 替换您现有的用户/组/权限设置。

    您可以在 Auth0 仪表板中或通过管理 API 以编程方式注册用户的角色和每个角色的相关权限。然后你可以设置一个规则到add user roles to the token

    要将此用户连接到您现有的用户数据存储,您可以存储 Auth0 id,类似于您描述的方式。

    这允许您在收到令牌时查找用户,并关联用户拥有的任何权限或角色。您可以通过向角色添加前缀来使角色特定于 API,或者根据您的需要使角色成为通用角色。

    【讨论】:

    • 我们几天前就开始这样实现了。我们有一个问题——我们需要能够几乎立即传播权限的变化。因此,当管理员更改某些用户的权限时,我们的后端服务必须知道使用令牌。在这种情况下你有什么建议?我认为非常短的令牌有效期是不可行的
    • 我明白了。需要立即与您的管理员更改保持一致,这意味着在令牌中拥有权限信息可能不是一个好方法。您将需要将该信息存储在您的数据库中,并将其与用户 ID 相关联,类似于您所描述的。我已经看到用于此类访问控制数据更改的短期令牌,但如果您需要它几乎是即时的,这听起来不像您的情况的解决方案。
    猜你喜欢
    • 2021-05-11
    • 2011-03-25
    • 2012-04-08
    • 2023-04-10
    • 2012-07-14
    • 2010-12-08
    • 2011-02-17
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多