Postgresql

建模使用者和組 - 但具有多種類型的組

  • April 1, 2022

我正在對 PostgreSQL 中的使用者管理系統進行建模,該系統非常典型,因為它由使用者、組和權限(以及它們之間的關係)組成。

但是,似乎我正在處理不同類型的組:一些代表組織(例如公司),而另一些代表組織內的角色或不同的權限級別(例如管理員)。組織代表業務領域中的租戶或客戶。

我目前看到兩種可能性:(a)為組織創建一個單獨的表,或者(b)在名為“is_organization”的組表中添加一個布爾列,並使用它來區分這兩種類型。

是否有對此類系統進行建模的最佳實踐?謝謝你。

創建公司表。創建/驗證您有一個 Group 表和一個 GroupCompany 表。這些將需要在向系統添加公司時填充。您可能想要為新公司創建一個通用組模板。添加到系統中的使用者將添加到組中。每個組都通過前面提到的 GroupCompany 表與一個公司聯繫在一起。您可以添加一個 GroupType 欄位來對整個系統中的公司組進行分類。

將公司添加到您的系統可幫助您在許多組織中擴展它。在您建構的大多數係統上,它應該是標準的。當要求我們有一個新客戶但他們希望單獨報告他們的所有數據時,您就會被覆蓋。

祝你好運

我可能不會在 PostgreSQL 中為使用者建模。如果這樣做,您將僅限於與您創建的應用程序互動。如果您使用其他解決方案,例如 LDAP,您將能夠在從手機到登錄系統到 Web 應用程序的所有設備上使用這些模型。

綜上所述,有一種比按照您的要求做更簡單的方法。因為通常在這些結構中,組織本身可以有子組織……

DROP TABLE role;
CREATE TABLE role (
 rid        serial PRIMARY KEY,
 parentrid  int    REFERENCES role,
 rn         text   CHECK ( rn NOT LIKE '%\.%' ),
 pw         text
);

INSERT INTO role (rn, pw, parentrid) VALUES
 ('stackexchange', DEFAULT, DEFAULT),
 ('jatwood', crypt('microsoftTyrant1', gen_salt('bf',10)), 1);

WITH RECURSIVE t(rid, dn, pw) AS (
 SELECT rid, rn, pw
 FROM role
 WHERE parentrid IS NULL
 UNION ALL
   SELECT role.rid, t.dn||'.'||role.rn, role.pw
   FROM t
   INNER JOIN role
     ON (t.rid = role.parentrid )
)
SELECT *
FROM t;

rid |          dn           |                              pw                              
-----+-----------------------+--------------------------------------------------------------
  1 | stackexchange         | 
  2 | stackexchange.jatwood | $2a$10$ovH1Bg75Kishth32lwQxpuHNFJgwGDt8mBdj79.BG0Zp3FDb3CGj6
(2 rows)

這將返回河豚加密的 dn/pw 表。從那裡開始,因為我們把他放在jatwood下面,stackexchange他會通過提供stackexchange.jatwood, 登錄(或者你會創建登錄字元串)。

好的…這會將您帶到權限。這已經涵蓋了很多。在你解決了匹配的 dn 之後,你需要弄清楚權限是如何工作的:

  • 他們是否應該從組中級聯/繼承。
  • 它們是否只適用於使用者。

引用自:https://dba.stackexchange.com/questions/168906