Trong PostgreSQL, tất cả được xây dựng xung quanh khái niệm vai trò .
Khi lần đầu tiên cài đặt PostgreSQL trên macOS, tập lệnh đã tạo một vai trò với tên người dùng macOS của bạn , với một danh sách các quyền được cấp.
Không có người dùng nào trong PostgreSQL, chỉ có vai trò .
Bằng cách chạy psql postgres
trong thiết bị đầu cuối của mình, bạn sẽ tự động đăng nhập bằng tên người dùng macOS của mình vào PostgreSQL, do đó, truy cập vào vai trò đã tạo.
Trong trường hợp của tôi, flaviocopes
vai trò đã được tạo và tôi có thể thấy nó bằng cách sử dụng \du
lệnh:
Xem? Tôi có các thuộc tính vai trò sau theo mặc định:
-
Superuser
-
Create role
-
Create DB
-
Replication
-
Bypass RLS
và tôi không phải là thành viên của bất kỳ vai trò nào khác (sẽ nói thêm về điều này sau)
Tạo vai trò mới
Một vai trò mới được tạo bằng cách sử dụng CREATE ROLE
lệnh:
CREATE ROLE <role>;
Ví dụ:
CREATE ROLE testing;
Chúng tôi có một vai trò mới, với Cannot login
thuộc tính vai trò. Người dùng mới được tạo của chúng tôi sẽ không thể đăng nhập.
Bạn có thể thử bằng cách nhập \q
và sau đó psql postgres -U testing
, nhưng bạn sẽ thấy lỗi này:
Để khắc phục sự cố này, chúng ta phải thêm LOGIN
thuộc tính vai trò khi tạo:
CREATE ROLE <role> WITH LOGIN;
Nếu chúng tôi xóa vai trò đó bằng cách sử dụng:
DROP ROLE <role>;
và thêm WITH LOGIN
lúc này:
DROP ROLE testing;
CREATE ROLE testing WITH LOGIN;
Chúng ta có thể thấy rằng testing
vai trò có thể đăng nhập, bởi vì chúng tôi không có Cannot login
thuộc tính vai trò lần này:
Hãy thử bằng cách thêm lệnh \q
để thoát và sau đó psql postgres -U testing
:
Lưu ý rằng dấu nhắc đã thay đổi từ =#
thành =>
bởi vì chúng tôi không có Superuser
thuộc tính vai trò bây giờ.
Thêm mật khẩu vào một vai trò
Trong CREATE ROLE
trước lệnh chúng tôi đã tạo một vai trò mà không cần mật khẩu. Tất nhiên, điều rất quan trọng là phải có mật khẩu (an toàn). Bạn có thể thêm mật khẩu bằng cách sử dụng PASSWORD
từ khóa:
CREATE ROLE <role> WITH LOGIN PASSWORD '<password>';
TẠO NGƯỜI DÙNG
Một cách thay thế để xác định vai trò với LOGIN
thuộc tính được thêm tự động (tạo hiệu quả người dùng có thể đăng nhập) là sử dụng CREATE USER
:
CREATE USER <role> PASSWORD '<password>';
Thêm thuộc tính vai trò vào vai trò
Sau này, một thuộc tính vai trò có thể được thêm vào một vai trò bằng cách sử dụng ALTER ROLE
lệnh.
Giả sử chúng ta đã tạo một vai trò mà không có thuộc tính LOGIN:
CREATE ROLE <username> PASSWORD '<password>';
Chúng tôi có thể thêm nó bằng cách sử dụng:
ALTER ROLE <role> WITH LOGIN;
Thuộc tính vai trò tích hợp
Chúng tôi đã thấy LOGIN
đã có thuộc tính vai trò, để cho phép một vai trò đăng nhập.
Nhưng các thuộc tính vai trò tích hợp sẵn khác mà chúng ta có thể sử dụng là gì?
-
LOGIN
/NOLOGIN
:cho phép (hoặc không) đăng nhập vào PostgreSQL -
SUPERUSER
/NOSUPERUSER
:cho phép (hoặc không) quyền của người dùng cấp trên. Một siêu người dùng cơ sở dữ liệu sẽ bỏ qua các kiểm tra quyền khác, ngoại trừLOGIN
(nó phải được cấp riêng). -
CREATEDB
/NOCREATEDB
:cho phép (hoặc không) khả năng tạo cơ sở dữ liệu mới -
CREATEROLE
/NOCREATEROLE
:cho phép (hoặc không) khả năng tạo vai trò mới -
CREATEUSER
/NOCREATEUSER
:cho phép (hoặc không) khả năng tạo người dùng mới -
INHERIT
/NOINHERIT
:cho phép (hoặc không) khả năng làm cho các đặc quyền có thể kế thừa -
REPLICATION
/NOREPLICATION
:cấp (hoặc không) quyền sao chép (một chủ đề nâng cao mà chúng tôi sẽ không đề cập đến)
Vai trò nhóm
Trong PostgreSQL, không có nhóm người dùng nào.
Thay vào đó, bạn có thể tạo các vai trò với các quyền nhất định, rồi cấp các vai trò đó cho các vai trò khác.
Các vai trò sẽ kế thừa các quyền của các vai trò được cấp cho chúng, nếu các vai trò đó có thuộc tính INHERIT.
Tạo vai trò trong nhóm
Để tạo vai trò nhóm, hãy nhập
CREATE ROLE <groupname>;
Cú pháp giống như tạo một vai trò.
Sau khi vai trò nhóm được tạo, bạn có thể thêm vai trò vào vai trò nhóm bằng cách sử dụng GRANT
:
GRANT <groupname> TO <role>
Ví dụ:chúng ta có thể tạo một flavio
vai trò người dùng, vai trò nhóm “nhân viên” và chỉ định người dùng vào vai trò nhóm:
CREATE USER flavio PASSWORD 'superSecret123$';
CREATE ROLE employee;
GRANT employee TO flavio;
Bạn có thể xóa một vai trò khỏi một vai trò nhóm bằng cách sử dụng:
REVOKE <groupname> FROM <username>
Ví dụ:
REVOKE employee FROM flavio;
Thuộc tính vai trò nhóm
Theo mặc định, việc thêm một vai trò vào một vai trò nhóm sẽ không làm cho vai trò kế thừa các thuộc tính (quyền) từ vai trò nhóm.
Bạn cần tạo vai trò nhóm với INHERIT
thuộc tính.
Giả sử bạn tạo vai trò nhóm nhân viên và gán cho vai trò đó là CREATEDB
thuộc tính:
CREATE ROLE employee WITH CREATEDB INHERIT;
Bây giờ, hãy tạo một vai trò mới bằng cách sử dụng INHERIT
:
CREATE ROLE flavio;
GRANT employee TO flavio;