Role trong PostgreSQL có thể đại diện cho một user riêng lẻ hoặc một nhóm user. Nó kiểm soát quyền truy cập vào database, table, schema và các object khác nữa.
Khi tạo role, mặc định nó không gắn với user hay nhóm nào cả, nhưng bạn có thể gán cho nó các thuộc tính và quyền phù hợp với nhu cầu của bạn.
Role khác gì user?
Còn user thì sao? Ở đây dễ nhầm lắm nha. Trong PostgreSQL, user cũng được coi là role, nhưng có điểm khác biệt: user luôn có thể đăng nhập vào hệ thống. Tức là, mỗi role đều có thể là user nếu nó có thuộc tính LOGIN. Nếu bạn chỉ muốn role để gom user thành nhóm hoặc không cho nó đăng nhập, thì khỏi cần thêm thuộc tính LOGIN luôn.
Ví dụ:
- Role có thuộc tính
LOGIN= user. - Role không có
LOGIN= nhóm hoặc "role phục vụ".
Tạo role
Để tạo role, dùng lệnh CREATE ROLE. Cú pháp như sau:
CREATE ROLE <tên_role> [WITH] [tham_số];
Trong đó tham_số — là các thuộc tính của role, ví dụ như:
LOGIN— quyền đăng nhập vào database.CREATEDB— quyền tạo database.CREATEROLE— quyền tạo role khác.SUPERUSER— toàn quyền (role này nguy hiểm, dùng cẩn thận nha).PASSWORD— mật khẩu để đăng nhập.
Cùng xem ví dụ tạo role user nha. Giả sử bạn muốn tạo user student có quyền đăng nhập và mật khẩu. Chạy lệnh này nè:
CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';
Lệnh này sẽ tạo role tên student, có thể kết nối vào database.
Giờ tạo role teachers là role nhóm. Role nhóm thì không cần thuộc tính LOGIN, vì user trong nhóm sẽ dùng tài khoản riêng của họ.
CREATE ROLE teachers;
Gán quyền cho role
Role trong PostgreSQL được tạo ra để cấp hoặc hạn chế quyền truy cập tài nguyên. Để làm việc này, dùng lệnh GRANT và REVOKE.
Cấp quyền với GRANT
Cú pháp lệnh:
GRANT <quyền> ON <đối_tượng> TO <role>;
Giờ tạo table courses và cấp cho role teachers quyền đọc và sửa dữ liệu trong table này nha.
-- Tạo table
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
teacher_id INT
);
-- Cấp quyền truy cập
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;
Giờ tất cả user thuộc role teachers đều có thể xem, thêm và sửa dữ liệu trong table này.
Thu hồi quyền với REVOKE
Để thu hồi quyền, dùng lệnh REVOKE. Cú pháp:
REVOKE <quyền> ON <đối_tượng> FROM <role>;
Muốn cấm nhóm teachers update dữ liệu trong table courses, chạy lệnh này:
REVOKE UPDATE ON courses FROM teachers;
Hệ thống phân cấp role: kế thừa
User có thể "kế thừa" quyền từ role nhóm để quản lý dễ hơn. Kiểu như truyền "di sản" từ người này sang người khác ấy.
Từ khóa INHERIT cho phép role kế thừa quyền từ role khác. Mặc định là bật, nhưng bạn có thể thay đổi nếu muốn.
Ví dụ:
-- Thêm user `john` vào nhóm `teachers`
GRANT teachers TO john;
Giờ user john tự động có tất cả quyền mà role nhóm teachers được cấp.
Kiểm tra quyền:
\du john
Nếu muốn tắt kế thừa, tạo role với thuộc tính NOINHERIT.
CREATE ROLE admin NOINHERIT;
Giờ user trong role admin mặc định sẽ không dùng được quyền của nó.
Tạo nhóm role để quản lý quyền truy cập
Nhóm role giúp quản lý quyền dễ hơn, nhất là trong dự án lớn. Thay vì cấp quyền cho từng user, bạn chỉ cần thêm user vào nhóm, rồi cấp quyền cho nhóm là xong.
Lấy ví dụ đơn giản về role nhóm nha. Tạo các nhóm như sau:
students— nhóm cho sinh viên.teachers— nhóm cho giảng viên.
CREATE ROLE students;
CREATE ROLE teachers;
Gán user vào nhóm:
-- Gán user john vào nhóm students
GRANT students TO john;
-- Gán user jane vào nhóm teachers
GRANT teachers TO jane;
Giờ chỉ cần cấp quyền cho table cho nhóm students và teachers là tất cả thành viên đều có quyền luôn!
Bài tập thực hành
- Tạo table
examsvới các trường:id: khóa chính;subject: text;teacher_id: ID giảng viên.
CREATE TABLE exams (
id SERIAL PRIMARY KEY,
subject TEXT NOT NULL,
teacher_id INT
);
- Tạo nhóm role
studentsvàteachers.
CREATE ROLE students;
CREATE ROLE teachers;
- Cấp cho nhóm
teachersquyền thêm và sửa dữ liệu trong tableexams.
GRANT INSERT, UPDATE ON exams TO teachers;
- Cấp cho nhóm
studentsquyền chỉ đọc dữ liệu.
GRANT SELECT ON exams TO students;
- Tạo user
alicevà thêm vào nhómstudents.
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
- Kiểm tra quyền của
alicebằng cách đăng nhập bằng tài khoản của bạn ấy.
Giờ bạn đã biết cách tạo role, quản lý quyền của chúng và đơn giản hóa việc quản trị bằng role nhóm rồi đó. Ở bài tiếp theo, mình sẽ chỉ bạn cách cấu hình quyền truy cập bằng lệnh GRANT và REVOKE để kiểm soát chi tiết hơn ở mức database, schema và table nha.
GO TO FULL VERSION