角色 在 PostgreSQL 裡可以代表單一個使用者,也可以是一群使用者。它負責管理對資料庫、資料表、schema 以及其他物件的存取權限。
當你建立一個角色時,預設它不會直接綁定到某個使用者或群組,但你可以給它設定屬性和權限,讓它符合你的需求。
角色跟使用者有什麼不同?
那使用者呢?這裡很容易搞混。在 PostgreSQL 裡,使用者其實也是一種角色,只是有個特點:使用者一定可以登入系統。也就是說,只要一個角色有 LOGIN 屬性,它就可以當作使用者。如果你只是想把一群人集合起來,或是不想讓這個角色能登入,就不用加 LOGIN 屬性。
舉個例子:
- 有
LOGIN屬性的角色 = 使用者。 - 沒有
LOGIN的角色 = 群組或「服務角色」。
建立角色
要建立角色,用 CREATE ROLE 指令。語法長這樣:
CREATE ROLE <角色名稱> [WITH] [參數];
這裡的 參數 就是角色的屬性,比如:
LOGIN— 能不能登入資料庫。CREATEDB— 能不能建立資料庫。CREATEROLE— 能不能建立其他角色。SUPERUSER— 超級權限(這個很危險,小心用)。PASSWORD— 登入密碼。
來看個建立使用者角色的例子。
假設你想建立一個叫 student 的使用者,可以登入系統並有密碼。你可以這樣下指令:
CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';
這樣就會建立一個叫 student 的角色,可以連線到資料庫。
現在我們來建立一個叫 teachers 的群組角色。群組角色不需要 LOGIN 屬性,因為群組裡的使用者會用自己的帳號登入。
CREATE ROLE teachers;
分配權限給角色
PostgreSQL 裡建立角色,就是為了分配或限制資源存取。這時會用到 GRANT 跟 REVOKE 這兩個指令。
用 GRANT 給權限
語法如下:
GRANT <權限> ON <物件> TO <角色>;
我們來建立一個 courses 資料表,然後給 teachers 這個角色讀取和修改這個表的權限。
-- 建立資料表
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
teacher_id INT
);
-- 給予存取權限
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;
現在所有屬於 teachers 這個角色的使用者,都可以查詢、加入和修改 courses 這個表的資料。
用 REVOKE 收回權限
要收回權限,用 REVOKE 指令。語法:
REVOKE <權限> ON <物件> FROM <角色>;
如果你想禁止 teachers 這個群組修改 courses 這個表的資料,可以這樣做:
REVOKE UPDATE ON courses FROM teachers;
角色階層:繼承
使用者可以「繼承」群組角色的權限,這樣管理起來比較方便。就像把「遺產」從一個人傳給另一個人一樣。
INHERIT 關鍵字讓角色可以繼承另一個角色的權限。這個行為預設是開啟的,但你也可以關掉。
舉個例子:
-- 把使用者 `john` 加進 `teachers` 群組
GRANT teachers TO john;
現在 john 這個使用者就自動擁有 teachers 群組角色的所有權限。
來查一下權限:
\du john
如果你想關掉繼承,建立角色時加上 NOINHERIT 屬性。
CREATE ROLE admin NOINHERIT;
這樣屬於 admin 這個角色的使用者,預設就不能直接用它的權限。
建立角色群組來管理存取
角色群組可以讓你更輕鬆管理權限,特別是在大型專案裡。你不用一個一個給使用者分配權限,只要把他們加進群組,再給群組權限就好。
來看個簡單的群組角色例子。我們先建立兩個群組:
students— 學生群組。teachers— 教師群組。
CREATE ROLE students;
CREATE ROLE teachers;
把使用者加進群組:
-- 把 john 加進 students 群組
GRANT students TO john;
-- 把 jane 加進 teachers 群組
GRANT teachers TO jane;
現在只要給 students 和 teachers 這兩個群組資料表的權限,所有成員都會自動有權限!
實作練習
- 建立一個
exams資料表,欄位有:id: 主鍵;subject: 文字;teacher_id: 教師 ID。
CREATE TABLE exams (
id SERIAL PRIMARY KEY,
subject TEXT NOT NULL,
teacher_id INT
);
- 建立
students和teachers兩個角色群組。
CREATE ROLE students;
CREATE ROLE teachers;
- 給
teachers群組新增和修改exams資料表的權限。
GRANT INSERT, UPDATE ON exams TO teachers;
- 給
students群組只有查詢的權限。
GRANT SELECT ON exams TO students;
- 建立一個叫
alice的使用者,並加進students群組。
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
- 用
alice的帳號登入,檢查她有什麼權限。
現在你已經知道怎麼建立角色、管理權限,還有怎麼用群組角色讓管理更簡單。下一堂課我們會講怎麼用 GRANT 和 REVOKE 指令,來更細緻地管理資料庫、schema 和資料表的存取權限。
GO TO FULL VERSION