PG中只讀帳號的授權操作

  • 2019 年 10 月 4 日
  • 筆記

日常工作中,我們通常開給研發2個帳號(一個只讀帳號,讀寫帳號)

讀寫帳號自不必說, ,每次用這個帳號建表後,自然就用了CRUD的許可權。

但是,只讀帳號稍微費事點,如果我們處理不好的話,每次新加表都要再執行一次對只讀帳號的重新授權操作。好在PG為我們考慮好了這個場景,也是有方法解決的。

看下面例子:

使用postgres超級帳號登錄PG,創建2個業務帳號

create user  rw login password '123456';   — 創建讀寫帳號

create user rd login password '123456';     — 創建只讀帳號

create database ticket;   — 創建測試用資料庫

alter database ticket owner to rw ;  — 將ticket庫owner改為 rw帳號

c ticket   — 切換到ticket庫下

grant select on all tables in schema public to rd ;   # 對rd帳號授權,當前已有的表的只讀許可權  (注意:這個命令對於當前已有的表生效。對於後期新創建的表,是沒有加其它的授權)

alter role rd  set default_transaction_read_only=true;   — 給rd用戶設置只讀模式

然後,我們使用rw帳號登錄PG:

c ticket

create table t (a int , b int ) ;  — 嘗試創建一張新表

ticket=> select * from  t;   這裡看到是可以執行查詢的

 a | b 

—+—

(0 rows)

然後,再開一個窗口,使用rd帳號登錄PG:

c ticket

ticket=> select * from  t;   這裡看到提示居然沒有查詢的許可權了

這時候,如果我們rd帳號需要訪問t表,則需要使用rw帳號再次執行下 grant SELECT on TABLE t to rd ; 命令,才能將rd帳號授予t表的select授權

更好用的解決方法(即,避免每次新加表後都要執行一次grant授權操作):

使用rw帳號登錄PG

c ticket 

ALTER DEFAULT PRIVILEGES IN SCHEMA public grant select on tables to rd;    — 對於後期使用rw帳號創建的表, rd帳號都可以讀取的(注意: 如果使用postgres超級帳號創建的表的話,rd帳號還是不能讀取的)

執行完上面的ALTER DEFAULT PRIVILEGES 命令操作後,使用rw帳號再去創建一個新的表,可以看到:

ticket=> create  table tb55(a int, b int);  ticket=> dp tb55                                Access privileges   Schema | Name | Type  | Access privileges | Column privileges | Policies   --------+------+-------+-------------------+-------------------+----------   public | tb55 | table | rw=arwdDxt/rw    +|                   |           |      |       | rd=r/rw           |                   | 

參考: 

        http://postgres.cn/docs/10/sql-alterdefaultprivileges.html

        https://www.postgresql.org/docs/11/runtime-config-client.html