Quyền người dùng PostgreSQL

Trong hướng dẫn này, tôi sẽ giải thích cách quản lý người dùng và quyền trong PostgreSQL.

Trong PostgreSQL, tất cả đều được xây dựng xung quanh khái niệmvai trò.

Khi lần đầu tiên cài đặt PostgreSQL trên macOS, tập lệnhđã tạo một vai trò bằng 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ạypsql postgrestrong thiết bị đầu cuối của bạn, 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,flaviocopesvai trò đã được tạo và tôi có thể thấy nó bằng cách sử dụng\duchỉ huy:

Xem? Tôi có cái sauthuộc tính vai trò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 một vai trò mới

Một vai trò mới được tạo bằng cách sử dụngCREATE ROLEchỉ huy:

CREATE ROLE <role>;

Ví dụ:

CREATE ROLE testing;

Chúng tôi có một vai trò mới, vớiCannot loginthuộ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 gõ\qlệnh, 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êmLOGINthuộc tính vai trò lúc 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êmWITH LOGINthời gian này:

DROP ROLE testing;
CREATE ROLE testing WITH LOGIN;

Chúng ta có thể thấy rằngtestingvai trò có thể đăng nhập, bởi vì chúng tôi không cóCannot loginthuộc tính vai trò lần này:

Hãy thử bằng cách thêm lệnh\qbỏ thuốc lá, và sau đópsql postgres -U testing:

Lưu ý rằnglời nhắcthay đổi từ=#đến=>bởi vì chúng tôi không cóSuperuserthuộc tính vai trò bây giờ.

Thêm mật khẩu vào một vai trò

Trước đâyCREATE ROLElệ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ụngPASSWORDtừ 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ớiLOGINthuộc tính tự động được thêm vào (tạo hiệu quả người dùng có thể đăng nhập) là sử dụngCREATE 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ụngALTER ROLEchỉ huy.

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ấyLOGINđã 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 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ò nhóm

Để tạo một vai trò nhóm, hãy nhập

CREATE ROLE <groupname>;

Cú pháp cũng giống như tạo một vai trò.

Sau khi vai trò nhóm được tạo, bạn có thể thêm các vai trò vào vai trò nhóm bằng cách sử dụngGRANT:

GRANT <groupname> TO <role>

Ví dụ: chúng ta có thể tạoflaviovai 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
;TẠO NÊN VAI TRÒNhân viên;BAN CHONhân viênĐẾNflavio;

Bạn có thể xóa vai trò khỏi vai trò nhóm bằng cách sử dụng:

REVOKE <groupname> FROM <username>

Thí dụ:

REVOKE employee FROM flavio;

Thuộc tính vai trò nhóm

Theo mặc định, thêm một vai trò vào một vai trò nhóm sẽkhông phảilà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ớiINHERITthuộc tính.

Giả sử bạn tạo vai trò nhóm nhân viên và gán nóCREATEDBthuộ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ụngINHERIT:

CREATE ROLE flavio;
GRANT employee TO flavio;


Các hướng dẫn khác về cơ sở dữ liệu: