Php 我应该使用Postgres';web应用程序的s角色系统';用户管理?

Php 我应该使用Postgres';web应用程序的s角色系统';用户管理?,php,postgresql,web-applications,Php,Postgresql,Web Applications,Postgres已经拥有功能齐全的用户管理系统。为什么我要复制此功能,并在此基础上使用另一个功能?我认为这是管理用户和组的正确地方,因为它允许细粒度的控制。我错了吗?是否有一些php库已经做到了这一点? 我应该补充一点,所讨论的应用程序不是一个公共网站,而是一个在专用网络中工作的公司应用程序。AFAIK这是不可能的,尽管可能 您的应用程序无法移植到其他数据库,mysql在web应用程序中非常流行 相反,您通常根据自己的需要设计用户表,自己编写组和访问管理,或者使用许多库中的一个 (注意PG角色系

Postgres已经拥有功能齐全的用户管理系统。为什么我要复制此功能,并在此基础上使用另一个功能?我认为这是管理用户和组的正确地方,因为它允许细粒度的控制。我错了吗?是否有一些php库已经做到了这一点?

我应该补充一点,所讨论的应用程序不是一个公共网站,而是一个在专用网络中工作的公司应用程序。

AFAIK这是不可能的,尽管可能

您的应用程序无法移植到其他数据库,mysql在web应用程序中非常流行

相反,您通常根据自己的需要设计用户表,自己编写组和访问管理,或者使用许多库中的一个


(注意PG角色系统的向上投票)

在应用程序中不使用操作系统的用户管理,因为每一层都使用用户授予其管理的对象的权限。操作系统有用户授予对进程、文件等的权限。RDBMS有用户授予对表、模式、序列等的权限


这些用户可能不会用于面向业务的对象的应用层,因此权限不同。

我强烈建议应用程序设计者利用PostgreSQL的用户和角色系统。。。但由于许多原因,将应用程序用户与数据库用户进行1:1映射通常是不现实的

  • PostgreSQL角色在所有数据库中共享(尽管它们不必被授予除一个之外的任何权限)

  • 从普通应用程序表到PostgreSQL用户表不能有外键引用

  • 没有任何函数或其他接口可以通过密码对用户进行身份验证。您必须建立新连接才能通过密码进行身份验证。这会中断连接池

相反,我建议您在数据库中使用几个角色:

  • 数据库所有者角色。此用户/角色拥有数据库及其内的表。更改数据库结构的脚本(“迁移”等)以此用户身份运行

  • webapp角色。这是应用程序在建立池连接时所扮演的角色。这是
    GRANT
    ed,仅授予应用程序在日常运行时所需的访问权限。它不能更改表结构、删除表等。如果一个表应该仅附加,则不授予此角色的
    UPDATE
    权限

  • (可能)脚本等的一些维护角色,这些角色只能访问任务所需的内容

您可以使用普通表管理应用程序用户

有时,您还需要为特定类别的用户提供额外的数据库角色。如果您正在处理具有不同权限级别、部门等的应用程序,这将非常方便。webapp可以
设置角色
切换角色,因此,如果“joe”连接并且您知道“joe”在帐户中,您可以在运行joe查询之前“设置角色帐户”。这是更先进的,大多数人不需要它


我认为直接使用PostgreSQL用户管理最有意义的时候是当应用程序具有相当复杂的访问需求,并且不需要大量不同的用户(数千,而不是数百万)时。对于webapps,我坚持使用普通的数据库表,只需将“db admin”角色与webapp连接池角色分开即可。

认为可移植到其他数据库与可移植到其他语言是一样的。这意味着使用所有rdbms(例如mysql)中最不常见的特性。如果您的开发是一个普通的论坛软件,那么它会很有用;如果您的开发是一个专门面向业务的应用程序,那么它会适得其反。我认为不需要将我的应用程序移植到另一个DBMS。因此,将其绑定到Postgres——最好的开源DBMS——并不是一件坏事。@greg我已经用pltcl(使用位字符串)编写了我的用户和组管理,可以移植到其他语言/批访问,而无需PHP。很高兴听到你的意见。谢谢你的Pomm顺便说一句,我在这个应用程序中大量使用它。考虑到这个应用程序是用PHP编写的(没有连接池问题),并且将在公司网络中使用(一次最多使用数百个用户),而且它确实需要高级访问管理(我在9.5中等待RLS)你还是不推荐使用它吗?@nii说PHP意味着没有连接池问题是没有意义的。您可以在PHP中使用一个池,或者像PgBouncer这样的代理池,这是非常常见的。但是,对于数百个并发用户,您可能不需要这样做。如果您正在考虑使用RLS等,那么它很值得一做。拥有in-DB用户的好处是,您可以
授予每个用户所需的特定角色,然后
只授予这些角色所需的特定权限。关于连接池,您是对的,我第一次没有读对,将来可能需要这样做。现在我认为我可以为不同的部门使用几个具有不同RLS访问权限的角色,并坚持应用程序级用户管理系统。另外,还有一种情况是,db级用户管理是正确的选择:当一个数据库被多个应用程序使用时