Bài viết này sẽ tìm hiểu về Group Roles của PostgreSQL và cách sử dụng chúng để quản lý các đặc quyền (privileges) hiệu quả hơn.
1. Giới thiệu về group roles của PostgreSQL
Việc quản lý roles như một group sẽ dễ dàng hơn để bạn có thể cấp hoặc thu hồi các đặc quyền từ toàn bộ nhóm thay vì thực hiện vai trò đó trên một vai trò riêng lẻ.
Nghãi là, bạn sẽ tạo một role đại diện cho một group – tức là role này được xem như là một group roles và sau đó cấp quyền thành viên (grants membership) trong group role cho các role thành viên (individual roles).
Theo quy ước, group roles không có đặc quyền LOGIN. Điều đó có nghĩa là bạn sẽ không thể sử dụng role có vai trò là một group roles để đăng nhập vào PostgreSQL.
Để tạo group roles, bạn sử dụng câu lệnh CREATE ROLE như sau:
CREATE ROLE role_name_group;
Ví dụ sau đây tạo ra một group rolescó tên là sales:
CREATE ROLE sales;
Để thêm một role vào group roles, bạn sử dụng câu lệnh GRANT
GRANT role_name_group TO role_name [, ...] [ WITH ADMIN OPTION ]
Ví dụ sau đây thêm role minhhoangblog vào group roles sales:
GRANT sales TO minhhoangblog;
Để xóa một user role khỏi group roles, bạn sử dụng câu lệnh REVOKE
REVOKE role_name_group FROM role_name;
Ví dụ sau đây xóa role minhhoangblog khỏi group roles sales:
REVOKE sales FROM minhhoangblog;
※Lưu ý rằng PostgreSQL không cho phép bạn có các vòng tròn thành viên, tức là trong group roles có một role là thành viên của role khác và ngược lại.
2. Ví dụ về Role Membership của PostgreSQL
Một role có thể sử dụng các đặc quyền của group roles bằng 1 trong 2 cách sau:
- Một role có thuộc tính INHERIT sẽ tự động có các đặc quyền của group roles mà nó là thành viên, bao gồm mọi đặc quyền được kế thừa bởi role đó.
- Một role có thể sử dụng câu lệnh SET ROLE để tạm thời trở thành một group role. Khi đó role này sẽ có các đặc quyền của group role so với role đăng nhập ban đầu của nó. Ngoài ra, các đối tượng được tạo bởi role được sở hữu bởi group role, chứ không phải role lúc đăng nhập.
Bước 1/3:
① Tạo một database mới có tên là company:
create database company;
② Tạo bảng contacts:
create table contacts( id int generated always as identity primary key, name varchar(255) not null, phone varchar(255) not null );
③ Tạo bảng forecasts:
create table forecasts( year int, month int, amount numeric );
Bước 2/3:
① Tạo một role có tên là hihongo có thể login bằng password 12345678 và kế thừa tất cả các đặc quyền của group roles mà nó là thành viên:
create role hihongo inherit login password '12345678';
② Cấp quyền (Grant) SELECT trên bảng forecasts cho role hihongo:
grant select on forecasts to hihongo;
③ Sử dụng lệnh \z để kiểm tra bảng cấp quyền (grant table):
\z
④ Tạo group role marketing:
create role marketing noinherit;
⑤ Tạo group role planning:
create role planning noinherit;
⑥ Cấp tất cả các đặc quyền (Grant all privileges) trên bảng contacts cho group role marketing:
grant all on contacts to marketing;
⑦ Cấp tất cả các đặc quyền (Grant all privileges) trên bảng forecasts cho group role planning:
grant all on forecasts to planning;
⑧ Thêm hihongo là một thành viên của group role marketing:
grant marketing to hihongo;
⑨ Thêm planning là một thành viên của group role marketing:
grant marketing to planning;
Bước 3/3:
① Nếu bạn kết nối với PostgreSQL bằng role hihongo, bạn sẽ có các đặc quyền được cấp trực tiếp cho role hihongo, cộng với bất kỳ đặc quyền nào được cấp cho group role marketing vì hihongo thừa hưởng các đặc quyền của marketing:
psql -U hihongo -d company
③ Role hihongo có thể select dữ liệu từ bảng forecasts:
company=> select * from forecasts;
④ chèn một hàng vào bảng contacts:
company=> insert into contacts(name, phone) values('Jone Doe','408-102-3459');
⑤ Tuy nhiên, hihongo không thể chèn một hàng vào bảng forecasts:
company=> insert into forecasts(year, month, amount) values(2020,1,1000); ERROR: permission denied for table forecasts
⑥ Sau khi thực hiện câu lệnh SET ROLE sau:
company=> set role planning;
Lúc này role hihongo sẽ có các đặc quyền đã được cấp cho group role planning, chứ không phải các đặc quyền được cấp trực tiếp cho role hihongo hoặc gián tiếp cho group role marketing.
⑦ Bây giờ, role hihongo đã có thể chèn một hàng vào bảng forecasts:
company=> insert into forecasts(year, month, amount) values(2020,1,1000);
⑧ Nếu hihongo cố gắng select data từ bảng contacts, nó sẽ thất bại vì group role planning không có đặc quyền trên bảng contacts:
company=> select * from contacts; ERROR: permission denied for table contacts
※Để khôi phục các đặc quyền ban đầu của role hihongo, bạn sử dụng câu lệnh RESET ROLE:
RESET ROLE;