CodeGym /Các khóa học /SQL SELF /Tạo và quản lý vai trò: ROLES

Tạo và quản lý vai trò: ROLES

SQL SELF
Mức độ, Bài học
Có sẵn

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

  1. Tạo table exams vớ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
);
  1. Tạo nhóm role students và teachers.
CREATE ROLE students;
CREATE ROLE teachers;
  1. Cấp cho nhóm teachers quyền thêm và sửa dữ liệu trong table exams.
GRANT INSERT, UPDATE ON exams TO teachers;
  1. Cấp cho nhóm students quyền chỉ đọc dữ liệu.
GRANT SELECT ON exams TO students;
  1. Tạo user alice và thêm vào nhóm students.
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
  1. Kiểm tra quyền của alice bằ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.

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Tạo vai trò nhóm và gán người dùng
Tạo vai trò nhóm và gán người dùng
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION