PostgreSQL

Xoá đặc quyền (privileges) khỏi ROLE bằng lệnh PostgreSQL REVOKE

Xoá đặc quyền (privileges) khỏi ROLE bằng lệnh PostgreSQL REVOKE
Được viết bởi Minh Hoàng

Series chia sẻ về PostgreSQL – Cơ sở dữ liệu mã nguồn mở tiên tiến nhất thế giới.

Bạn có thể sử dụng lệnh REVOKE để thu hồi các đặc quyền được thêm vào một role bằng lệnh GRANT. Bài viết này sẽ giải thích cách sử dụng câu lệnh PostgreSQL REVOKE để xóa các đặc quyền của một role. Đặc quyền có thể là tạo tablesschemas, lấy dữ liệu từ tables và thêm dữ liệu,…

1. Giới thiệu về lệnh thêm quyền PostgreSQL REVOKE

1. Giới thiệu về lệnh thêm quyền PostgreSQL REVOKE

Bạn có thể sử dụng lệnh REVOKE để xóa đặc quyền của một role đã được thêm vào bằng lệnh GRANT.

Một số định dạng có sẵn cho từng mục đích khác nhau như sau:

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ ADMIN OPTION FOR ]
    role_name [, ...] FROM role_specification [, ...]
    [ GRANTED BY role_specification ]
    [ CASCADE | RESTRICT ]

where role_specification can be:

    [ GROUP ] role_name
  | PUBLIC
  | CURRENT_USER
  | SESSION_USER

Có nhiều, nhưng định dạng cơ bản là:

REVOKE permission ON target FROM role_name;

Giải thích chi tiết về permission, target, role_name, xem thêm tại bài viết Cấp đặc quyền (privileges) cho ROLE bằng lệnh PostgreSQL GRANT.

Khi lệnh REVOKE được thực thi với GRANT OPTION FOR, chỉ role có quyền cấp đặc quyền cho các roles khác bị loại bỏ (đặc quyền được thêm bởi WITH GRANT OPTION bằng lệnh GRANT). Nếu không được chỉ định, cả đặc quyền đã thêm cho role đó và cho các roles khác đều bị xóa (thu hồi).

Bạn có thể chỉ định RESTRICT hoặc CASCADE ở cuối lệnh REVOKE. Nếu bạn đã thêm các quyền tương tự cho mình vào một role khác, thì cài đặt mặc định (RESTRICT) sẽ không thành công khi bạn cố gắng xóa các quyền đã thêm cho mình. Nếu CASCADE được chỉ định, các đặc quyền mà bản thân đã thêm vào các roles khác sẽ bị xóa cùng lúc với các đặc quyền của bản thân.

Các đặc quyền có thể bị xóa khỏi các roles khác bởi chủ sở hữu (owner) và superuser của đối tượng được đề cập. Đối với các roles khác, nếu lệnh GRANT với WITH GRANT OPTION được sử dụng để thêm một đặc quyền vào các roles khác và nếu đặc quyền đã được thêm vào một role khác, thì chỉ đặc quyền đó mới bị xóa.

Bây giờ chúng ta hãy xem cách sử dụng nó một cách cụ thể hơn qua các mục trình bày tiếp theo.

2. Xóa quyền khỏi bảng

2. Xóa quyền khỏi bảng

Định dạng của lệnh REVOKE được sử dụng để loại bỏ các đặc quyền trên bảng là:

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    FROM role_specification [, ...]
    [ CASCADE | RESTRICT ]

Ví dụ sau sẽ loại bỏ các đặc quyền permission SELECTINSERT trên target là bảng table_name khỏi role_name:

REVOKE SELECT, INSERT ON table_name FROM role_name;

Chỉ xóa đặc quyền đã thêm vào các roles khác và quyền SELECT trên bảng table_name từ role role_name:

REVOKE GRANT OPTION FOR SELECT ON table_name FROM role_name;

Loại bỏ đặc quyền SELECT trên table table_name khỏi role_name, đồng thời xóa đặc quyền SELECT được role_name thêm vào các role khác:

REVOKE SELECT ON table_name FROM role_name CASCADE;

Trường hợp muốn thêm tất cả các quyền thì dùng lệnh:

REVOKE ALL [PRIVILEGES] ON table_name FROM role_name;


Bây giờ sẽ đi vào ví dụ thực tế xem thế nào. Let’s Go!

Hiện tại, bảng product được tạo trong lược đồ public và các đặc quyền a(INSERT), r(SELECT)w(UPDATE) được thêm vào role nihongo.

¥dp

Xoá đặc quyền (privileges) khỏi ROLE bằng lệnh PostgreSQL REVOKE (1)

Các giá trị sau được đặt trong quyền truy cập của bảng product:

postgres=arwdDxt/postgres+
nihongo=arw/postgres

Cách đọc giá trị cài đặt giống như đã trình bày ở bài viết Cấp đặc quyền (privileges) cho ROLE bằng lệnh PostgreSQL GRANT. Ở đây là role postgres đã thêm các quyền a(INSERT), r(SELECT)w(UPDATE) cho role nihongo.

Bây giờ xóa quyền r(SELECT) trên bảng product khỏi role nihongo. Thực hiện lệnh sau đây khi đã kết nối với tư cách là superuser:

REVOKE SELECT ON product FROM nihongo;

và quyền r(SELECT) đã bị xóa:

Xoá đặc quyền (privileges) khỏi ROLE bằng lệnh PostgreSQL REVOKE (2)

Tiếp theo, xóa tất cả các quyền trên bảng product khỏi role nihongo. Thực hiện lệnh sau đây khi đã kết nối với tư cách là superuser:

REVOKE ALL PRIVILEGES ON product FROM nihongo;

và các đặc quyền còn lại a(INSERT)w(UPDATE) cũng đã bị xóa.

Xoá đặc quyền (privileges) khỏi ROLE bằng lệnh PostgreSQL REVOKE (3)

3. Xóa quyền với chỉ định CASCADE

3. Xóa quyền với chỉ định CASCADE

Nếu role A đang thêm một đặc quyền được thêm vào chính nó vào một role B khác (ý là lúc này 2 role A và B có rằng buộc với nhau), thì dù có cố xóa đặc quyền của role A sẽ không được. Trong trường hợp như vậy, hãy chỉ định CASCADE khi thực hiện lệnh REVOKE. Nếu CASCADE được chỉ định, các đặc quyền của role A sẽ bị xóa và đồng thời, các đặc quyền được thêm bởi role A vào role B cũng bị xóa trong một chuỗi rằng buộc đó.

Đầu tiên, kết nối với PostgreSQL bằng role superuser và sau đó thêm đặc quyền SELECT vào role nihongo cho bảng product trong lược đồ public. Tại thời điểm này, hãy thêm WITH GRANT OPTION để role nihongo cũng có thể thêm đặc quyền cho các roles khác.

GRANT SELECT ON product TO nihongo WITH GRANT OPTION;

Xoá đặc quyền (privileges) khỏi ROLE bằng lệnh PostgreSQL REVOKE (4)

Tiếp theo, sau khi kết nối với PostgreSQL bằng role nihongo, thì thêm đặc quyền SELECT vào role minhhoangblog cho bảng product trong lược đồ public.

GRANT SELECT ON product TO minhhoangblog;

Xoá đặc quyền (privileges) khỏi ROLE bằng lệnh PostgreSQL REVOKE (5)

Các giá trị sau được đặt trong quyền truy cập của bảng product:

postgres=arwdDxt/postgres+
nihongo=r*/postgres            +
minhhoangblog=r/nihongo

Cách đọc giá trị cài đặt giống như đã trình bày ở bài viết Cấp đặc quyền (privileges) cho ROLE bằng lệnh PostgreSQL GRANT.

Ở đây là role postgres đã thêm quyền r(SELECT)*(with grant option) vào role nihongo, và role nihongo thêm đặc quyền r(SELECT) vào role minhhoangblog.

Bây giờ chúng ta thử xóa đặc quyền r(SELECT) trên bảng product khỏi role nihongo. Thực hiện lệnh sau khi kết nối như một superuser, chẳng hạn là postgres:

REVOKE SELECT ON product FROM nihongo;

Xoá đặc quyền (privileges) khỏi ROLE bằng lệnh PostgreSQL REVOKE (6)

sẽ nhận được thông báo lỗi “ERROR: Dependent permission exists” và việc thu hồi quyền không thành công. Vì quyền bạn đang cố gắng xóa khỏi role nihongo, đang được role nihongo thêm vào một role khác.

Trong những trường hợp như vậy, hãy chỉ định thêm CASCADE trong lệnh REVOKE. Thực hiện lệnh sau khi kết nối như một superuser, chẳng hạn là postgres:

REVOKE SELECT ON product FROM nihongo CASCADE;

Xoá đặc quyền (privileges) khỏi ROLE bằng lệnh PostgreSQL REVOKE (7)

Lần này quyền đã được xóa thành công.

Quyền được thêm vào role nihongo đã bị xóa khỏi giá trị của quyền truy cập. Và đồng thời, quyền được thêm vào role minhhoangblog cũng bị xóa. Bằng cách chỉ định CASCADE khi thực hiện lệnh REVOKE theo cách này, bạn có thể xóa theo tầng ngay cả khi đặc quyền bạn đang cố gắng thu hồi đã được thêm vào một role khác.

Xem thêm: Cấp đặc quyền (privileges) cho ROLE bằng lệnh PostgreSQL GRANT

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Translate »