我应该使用 Postgres 的角色系统来管理 Web 应用程序的用户吗?
Should I use Postgres's roles system for a web app's user management?
Postgres 已经有了功能齐全的用户管理系统。为什么我应该复制此功能并在此之上使用另一个功能?我认为这是管理用户和组的正确位置,因为它允许细粒度控制。我错了吗?是否有一些 php 库已经这样做了?
我应该补充一点,有问题的应用程序不是 public 网站,而是在专用网络中运行的公司应用程序。
据我所知,这还没有完成,尽管可能。
您的应用程序不会 table 到其他数据库,并且 mysql 对于网络应用程序来说非常流行。
相反,您通常 table 根据自己的需要设计用户,自己编写组和访问管理,或者使用众多库之一。
(关注PG角色系统的点赞)
您不在应用程序中使用 OS 的用户管理,因为每个层都使用用户来授予对其管理的对象的权限。 OS 让用户授予对流程、文件等的权限。RDBMS 让用户授予对表、模式、序列等的权限。
这些用户可能不会在您的应用程序层中使用,其中面向业务的对象因此权限不同。
我强烈建议应用程序设计人员使用 PostgreSQL 的用户和角色系统...但是出于多种原因,1:1 将应用程序用户映射到数据库用户通常并不实用。
PostgreSQL 角色在所有数据库中共享(尽管他们不必被授予除一个之外的任何权限)
您不能从普通应用程序 table 到 PostgreSQL 用户 table
引用外键
没有通过密码验证用户的功能或其他界面。您必须建立新连接才能通过密码进行身份验证。这会破坏连接池。
相反,我建议您在数据库中使用几个 角色:
数据库所有者角色。此 user/role 拥有数据库和其中的 table。更改数据库结构的脚本("migrations" 等)运行 作为该用户。
一个 webapp 角色。这是应用程序在建立池连接时连接的角色。这只是 GRANT
应用在日常 运行 时需要的访问权限。它不能更改 table 结构,删除 tables 等。如果 table 应该是仅追加的,则不要授予此角色 UPDATE
权限.
(可能)脚本等的一些维护角色,这些角色只能有限地访问他们完成任务所需的内容。
您使用正常 tables 管理您的应用程序用户。
有时您还需要为特定类别的用户提供额外的数据库角色。如果您正在处理具有不同权限级别、部门等的应用程序,这会很方便。Web 应用程序可以 SET ROLE
切换角色,因此如果 "joe" 连接并且您知道 "joe" 在帐户,您 "SET ROLE accounts" 在 运行ning 查询 joe 之前。这个比较高级,一般人不需要。
我认为直接使用 PostgreSQL 用户管理有意义的主要时间是应用程序具有相当复杂的访问要求并且不需要大量不同的用户(数千,而不是数百万)。对于 webapps,我会坚持使用普通数据库 tables,只是将 "db admin" 角色与 webapp 连接池角色分开。
Postgres 已经有了功能齐全的用户管理系统。为什么我应该复制此功能并在此之上使用另一个功能?我认为这是管理用户和组的正确位置,因为它允许细粒度控制。我错了吗?是否有一些 php 库已经这样做了?
我应该补充一点,有问题的应用程序不是 public 网站,而是在专用网络中运行的公司应用程序。
据我所知,这还没有完成,尽管可能。
您的应用程序不会 table 到其他数据库,并且 mysql 对于网络应用程序来说非常流行。
相反,您通常 table 根据自己的需要设计用户,自己编写组和访问管理,或者使用众多库之一。
(关注PG角色系统的点赞)
您不在应用程序中使用 OS 的用户管理,因为每个层都使用用户来授予对其管理的对象的权限。 OS 让用户授予对流程、文件等的权限。RDBMS 让用户授予对表、模式、序列等的权限。
这些用户可能不会在您的应用程序层中使用,其中面向业务的对象因此权限不同。
我强烈建议应用程序设计人员使用 PostgreSQL 的用户和角色系统...但是出于多种原因,1:1 将应用程序用户映射到数据库用户通常并不实用。
PostgreSQL 角色在所有数据库中共享(尽管他们不必被授予除一个之外的任何权限)
您不能从普通应用程序 table 到 PostgreSQL 用户 table
引用外键
没有通过密码验证用户的功能或其他界面。您必须建立新连接才能通过密码进行身份验证。这会破坏连接池。
相反,我建议您在数据库中使用几个 角色:
数据库所有者角色。此 user/role 拥有数据库和其中的 table。更改数据库结构的脚本("migrations" 等)运行 作为该用户。
一个 webapp 角色。这是应用程序在建立池连接时连接的角色。这只是
GRANT
应用在日常 运行 时需要的访问权限。它不能更改 table 结构,删除 tables 等。如果 table 应该是仅追加的,则不要授予此角色UPDATE
权限.(可能)脚本等的一些维护角色,这些角色只能有限地访问他们完成任务所需的内容。
您使用正常 tables 管理您的应用程序用户。
有时您还需要为特定类别的用户提供额外的数据库角色。如果您正在处理具有不同权限级别、部门等的应用程序,这会很方便。Web 应用程序可以 SET ROLE
切换角色,因此如果 "joe" 连接并且您知道 "joe" 在帐户,您 "SET ROLE accounts" 在 运行ning 查询 joe 之前。这个比较高级,一般人不需要。
我认为直接使用 PostgreSQL 用户管理有意义的主要时间是应用程序具有相当复杂的访问要求并且不需要大量不同的用户(数千,而不是数百万)。对于 webapps,我会坚持使用普通数据库 tables,只是将 "db admin" 角色与 webapp 连接池角色分开。