Giới thiệu về roles trong PostgreSQL
Bài viết này sẽ mô tả về roles của PostgreSQL và cách sử dụng câu lệnh CREATE ROLE để tạo role mới.
PostgreSQL sử dụng roles cũng để thể hiện tài khoản người dùng (user accounts), mà không sử dụng khái niệm người dùng (user) như các hệ thống cơ sở dữ liệu khác.
Thông thường, roles có thể đăng nhập được gọi là login roles. Chúng tương đương với người dùng (user) trong các hệ thống cơ sở dữ liệu khác.
Khi roles chứa các roles khác, chúng được gọi là group roles.
Từ phiên bản 8.1, PostgreSQL đã kết hợp người dùng (users) và nhóm (groups) thành roles.
1. Cách tạo một role mới
Sử dụng lệnh CREATE ROLE để tạo một role mới với định dạng như sau:
CREATE ROLE name [ [ WITH ] option [ ... ] ] option có thể là: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMIT connlimit | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL | VALID UNTIL 'timestamp' | IN ROLE role_name [, ...] | IN GROUP role_name [, ...] | ROLE role_name [, ...] | ADMIN role_name [, ...] | USER role_name [, ...] | SYSID uid
※Để tạo được role, role thực thi lệnh phải là superuser hoặc có đặc quyền CREATEROLE.
Khi bạn tạo một role mới thì nó sẽ có hiệu lực trong tất cả các cơ sở dữ liệu trong máy chủ cơ sở dữ liệu PostgreSQL (hoặc cluster).
Mặc dù có nhiều option – cũng là thuộc tính của role (role attributes), định dạng cơ bản khi sử dụng cho mục đích xác thực người dùng (user authentication) bằng role như sau:
CREATE ROLE name [ WITH ] LOGIN PASSWORD 'password';
Chỉ định tên role name và tạo một role có thể được sử dụng làm mục tiêu xác thực người dùng khi kết nối với PostgreSQL từ máy khách (client), với mật khẩu ‘password’ được sử dụng để xác thực.
Chúng ta sẽ thử tạo một role mới có name là minhhoangblog với password là ‘12345678’ như sau
CREATE ROLE minhhoangblog WITH LOGIN PASSWORD '12345678';
Sau đó hiển thị danh sách các roles đã được tạo bằng lệnh ¥du
Lệnh ¥du liệt kê tất cả các roles hiện có trong máy chủ cơ sở dữ liệu PostgreSQL hiện tại. Còn nếu muốn lấy cả các roles của hệ thống (system roles) bắt đầu bằng pg_ thì bạn có thể truy vấn chúng từ danh mục hệ thống (system catalog) pg_roles như sau:
SELECT rolname FROM pg_roles;
2. Cách kết nối với PostgreSQL bằng role đã tạo
Chúng ta sẽ kết nối đến database mydb bằng role minhhoangblog đã tạo ở trên và nhập password 12345678 để kết nối với lệnh như sau:
psql -U minhhoangblog -d mydb
Khi sử dụng psql, nếu bạn bỏ qua cơ sở dữ liệu để kết nối, thì mặc định sẽ cố gắng kết nối đến cơ sở dữ liệu có cùng tên với tên role, nhưng vì cơ sở dữ liệu có tên minhhoangblog chưa được tạo, nên lần này chúng ta đã chỉ định rõ ràng tên cơ sở dữ liệu đã có sẵn để kết nối đến là mydb.
3. Giải thích một số option của lệnh CREATE ROLE
Phần này sẽ mô tả các tùy chọn liên quan đến quyền hạn trong số các tùy chọn có thể được chỉ định bằng lệnh CREATE ROLE
SUPERUSER hoặc NOSUPERUSER
Nếu bạn chỉ định SUPERUSER, role bạn tạo sẽ là superuser. Hãy cẩn thận khi tạo bởi vì superuser sẽ có hầu hết các đặc quyền (privileges).
Ngay sau khi cài đặt hoàn thành PostgreSQL, một superuser có tên là postgres sẽ được tạo mặc định.
Nếu bạn chỉ định NOSUPERUSER thì sẽ tạo một role không phải là superuser. Và nếu option này bị bỏ qua CREATE ROLE name;
thì NOSUPERUSER được chỉ định theo mặc định.
CREATE ROLE name
SUPERUSER
LOGIN
PASSWORD 'password';
Role superuser có thể ghi đè tất cả các hạn chế truy cập trong cơ sở dữ liệu. Do đó, bạn chỉ nên tạo role này khi cần.
※Lưu ý rằng role của bạn phải là một superuser để tạo một role superuser khác.
CREATEDB hoặc NOCREATEDB
Nếu bạn chỉ định CREATEDB thì role bạn tạo có đặc quyền để tạo cơ sở dữ liệu. Cơ sở dữ liệu không thể được tạo khi NOCREATEDB được chỉ định.
Nếu option này bị bỏ qua CREATE ROLE name;
thì NOCREATEDB được chỉ định theo mặc định.
CREATE ROLE name
CREATEDB
LOGIN
PASSWORD 'password';
CREATEROLE hoặc NOCREATEROLE
Nếu bạn chỉ định CREATEROLE, role bạn tạo có đặc quyền để tạo mới một role. Nếu NOCREATEROLE được chỉ định thì role mới tạo không được phép tạo role mới.
※Lưu ý rằng một role khi được cấp đặc quyền CREATEROLE có thể tạo ra các role mới có các đặc quyền mà nó không có. Vì vậy, việc chỉ định CREATEROLE có ý nghĩa tương tự như việc cấp gần như tất cả các đặc quyền.
Nếu option này bị bỏ qua CREATE ROLE name;
thì NOCREATEROLE được chỉ định theo mặc định.
CREATE ROLE name
CREATEROLE
LOGIN
PASSWORD 'password';
Ví dụ tạo một role mới có quyền CREATEDB và CREATEROLE
CREATE ROLE minhhn CREATEDB CREATEROLE LOGIN PASSWORD '12345678';
Nhìn vào phần thuộc tính của role mới được tạo, nó được hiển thị rằng role minhhn có quyền “role có thể được tạo” và “DB có thể được tạo“.
VALID UNTIL ‘timestamp’
Tạo role với thời gian password hiệu lực bằng cách đặt ngày và thời gian sau đó mật khẩu của role không còn hợp lệ.
Ví dụ sau đây tạo một role minhhoang với mật khẩu hợp lệ cho đến hết năm 2022:
CREATE ROLE minhhoang WITH LOGIN PASSWORD '12345678' VALID UNTIL '2023-01-01';
Nếu mật khẩu hết hạn và trở nên không hợp lệ thì bạn không thể xác thực (authenticate) ngay cả khi bạn đặt mật khẩu mới. Để kích hoạt (enable) role xác thực lại mật khẩu, bạn phải hủy cài đặt hết hạn mật khẩu bằng lệnh ALTER ROLE
Để hủy cài đặt hết hạn mật khẩu cho role minhhoang thì sẽ chỉ định ngày và giờ sớm hơn ngày hiện tại là ngày hết hạn hoặc thiết lập infinity có nghĩa là vô hạn.
ALTER ROLE minhhoang WITH VALID UNTIL 'infinity';
Kiểm tra lại thuộc tính của role minhhoang chúng ta thấy rằng kỳ hạn hiệu lực của mật khẩu đã được thay đổi thành infinity (vô hạn)
\du minhhoang
CONNECTION LIMIT connlimit
Để chỉ định số lượng kết nối đồng thời mà một role có thể thực hiện, bạn hãy sử dụng option CONNECTION LIMIT
Sau đây tạo ra một role mới fpt_minhhn có thể được 1000 kết nối đồng thời:
CREATE ROLE fpt_minhhn WITH LOGIN PASSWORD '12345678' CONNECTION LIMIT 1000;
Cùng xem tất cả các role mà chúng ta đã tạo nãy giờ:
Xem thêm: https://www.postgresql.org/docs/current/sql-createrole.html.