PostgreSQL 是一款開源的 DBMS,它進一步使用 SQL。這是一個非常強大的工具,用於在 VPS 上管理應用程式和託管網頁數據。在本教學中,您將學習如何在 PostgreSQL 中管理權限。它將幫助您為您的應用程式角色提供所需的權限。我們將在 Ubuntu 18.04 雲端伺服器 在 CloudSigma 上。
安裝 PostgreSQL
要下載並安裝 PostgreSQL,請執行以下命令:
|
1 2 |
sudo apt-get update sudo apt-get install postgresql postgresql-contrib |
安裝程式將建立一個預設使用者 – “Postgres” 來進行操作。在本教學的大部分內容中,我們都將使用此使用者。您可以使用此命令登入該使用者:
|
1 |
sudo su - postgres |
現在 PostgreSQL 已經安裝完畢,您將學習它如何處理權限。您也可以參考我們的 在 Ubuntu 上設定 PostgreSQL 的教學 ,以獲取安裝過程的詳細逐步指南。
PostgreSQL 權限概念
Postgres 透過 “角色” 的概念來管理權限。使用角色時,使用者和群組之間沒有區別。角色比傳統 Unix 系統的使用者和群組更具彈性。例如,一個角色可以作為另一個角色的成員,並繼承其權限。
在 PostgreSQL 中檢視角色
要檢視 PostgreSQL 中的角色,您需要先使用以下命令登入提示字元:
|
1 |
psql |
然後,執行以下命令以檢視角色:
|
1 |
\du |

目前,只有一個具有所有權限的預設角色。
如何在 PostgreSQL 中建立角色
您可以從命令列或在 Postgres 終端機中為 Postgres 建立角色。您可以嘗試以下兩種方法,隨後您將了解如何在 PostgreSQL 中管理權限和存取。
如何從 PostgreSQL 內部建立角色
建立角色最簡單的方法是在 Postgres 的提示字元中進行。您可以使用以下命令來執行此操作:
|
1 |
CREATE ROLE demo_role; |
要檢查它是否已建立,請執行命令:
|
1 |
\du |

它指出新角色沒有登入權限。您將在稍後的教學中學習如何變更該設定。
如何從命令列建立角色
上述方法的替代方案是從命令列建立使用者。要退出 PostgreSQL 提示字元,請輸入以下內容:
|
1 |
\q |
您可以使用以下命令建立一個名為 “test” 的角色:
|
1 |
createuser test |
執行上述命令後,登入 psql,並使用以下命令列出角色:
|
1 2 |
psql \du |

您可以觀察到,以此方式建立的使用者不具有相同的屬性。
如何在 PostgreSQL 中刪除角色
您可以使用以下語法輕鬆刪除 PostgreSQL 中的角色:
|
1 |
DROP ROLE role_name; |
您可以使用以下命令刪除我們之前建立的示範角色:
|
1 |
DROP ROLE demo_role; |

如果我們嘗試刪除一個不存在的角色,它只會拋出錯誤。要查看此情況,您可以嘗試再次刪除同一個角色:
|
1 |
DROP ROLE demo_role; |

如果您希望在角色不存在時命令不拋出錯誤,可以在命令中加入 ‘IF EXISTS’:
|
1 |
DROP ROLE IF EXISTS role_name; |
您可以使用此命令重新嘗試刪除該角色:
|
1 |
DROP ROLE IF EXISTS demo_role; |
如何在建立角色時定義權限
到目前為止,您已經建立並刪除了角色。在本節中,您將建立具有不同權限的角色。您可以透過在 create 命令中指定角色的權限來執行此操作:
|
1 |
CREATE ROLE role_name WITH optional_permissions; |
要查看此選項,您可以使用此命令開啟說明:
|
1 |
\h CREATE ROLE |

如果您想建立一個具有登入權限的角色,可以像這樣建構命令:
|
1 |
CREATE ROLE demo_role WITH LOGIN; |

正如我們前面所見,如果您想建立具有登入權限的角色,您也可以使用以下命令:
|
1 |
CREATE USER role_name; |
這兩個命令之間唯一的區別在於,‘CREATE USER’ 預設會賦予該角色登入權限。
如何在 PostgreSQL 中變更角色的權限
到目前為止,您已經嘗試了在建立使用者時如何賦予權限。在本節中,您將修改已建立使用者的權限。修改命令的語法為:
|
1 |
ALTER ROLE role_name WITH attribute_options; |
例如,如果需要,您可以使用此命令將 demo_role 的登入權限變更為 ‘log in’:
|
1 |
ALTER ROLE demo_role WITH NOLOGIN; |

若要允許使用者再次登入,您可以使用以下命令修改權限:
|
1 |
ALTER ROLE demo_role WITH LOGIN; |
如何在 PostgreSQL 中以不同的使用者身分登入
預設情況下,如果您的使用者名稱與系統使用者名稱相符,PostgreSQL 僅允許您在本地登入。為了解決這個問題,您可以變更登入類型,或者將 PostgreSQL 設定為使用環回網路介面。即使連線是本地的,該介面也會將連線類型變更為遠端。
在本節中,您將嘗試第二種方法。首先,您可以設定使用者的密碼,以便進行驗證。
使用以下命令設定 ‘demo_user’ 的密碼:
|
1 |
\password test |
出現提示時,輸入並確認密碼。完成後,您可以退出 PostgreSQL 介面並返回到您一般的機器使用者:
|
1 2 |
\q exit |
PostgreSQL 要求您使用與作業系統使用者名稱相符的使用者名稱進行登入,並且使用相同的使用者名稱連接資料庫。由於在此情況下您並非如此操作,因此您必須明確指定要使用的選項。您可以使用以下語法:
|
1 |
psql -U <span class="highlight">user</span> -d <span class="highlight">db</span> -h 127.0.0.1 -W |
user:您想要用來連線的使用者名稱
DB:您有權限存取的現有資料庫
-h 127.0.0.1:向 PostgreSQL 指定您將透過網路介面連線到本機。即使使用者名稱與系統使用者名稱不符,此選項也允許我們進行驗證。
-W:指示 PostgreSQL 您將輸入密碼
要使用我們的 “test_user” 登入,我們可以發布以下命令:
|
1 |
psql -U test -d postgres -h 127.0.0.1 -W |

輸入密碼後,您將登入到 shell。在我們的範例中,我們使用資料庫 ‘postgres’,這是安裝過程中自動設定的預設資料庫。
在此工作階段中,根據您選擇登入的使用者,您將面臨沒有適當權限來執行各種操作的問題。此問題的原因在於您尚未給予該使用者足夠的權限來管理事務。
在下一節中,您將向使用者授予所需的權限。首先,您需要將使用者切換回管理員使用者:
|
1 2 3 |
\q sudo su - postgres psql |
在 PostgreSQL 中管理權限:如何在 PostgreSQL 中授予權限
在 PostgreSQL 中,如果資料庫或資料表是由特定角色建立的,則只有該角色有權限對其進行修改。例外情況是具有超級使用者權限的角色。在本節中,您將向其他角色授予權限。您可以使用 ‘GRANT’ 陳述式向其他角色授予權限。語法為:
|
1 |
GRANT permission_type ON table_name TO role_name; |
您可以建立一個簡單的資料表來執行該命令:
|
1 2 3 4 |
CREATE TABLE demo ( name varchar(25), id serial, start_date date); |
若要查看已建立的資料表,請執行以下命令:
|
1 |
\d |

現在您有了一個 demo 資料表,您可以將 ‘demo’ 資料表的權限授予 ‘demo_role’。您可以使用此命令給予該角色 ‘UPDATE’ 權限:
|
1 |
GRANT UPDATE ON demo TO demo_role; |
您可以透過將權限指定為 ‘ALL’ 來授予角色所有權限:
|
1 |
GRANT ALL ON demo TO demo_role; |
如果您想將特定權限授予系統上的所有角色,可以使用關鍵字 ‘public’ 代替角色,如下列命令所示:
|
1 |
GRANT INSERT ON demo TO PUBLIC; |
您可以使用以下命令查看所有已授予的權限:
|
1 |
\z |
在 PostgreSQL 中管理權限:如何在 PostgreSQL 中移除權限
您可以使用 ‘REVOKE’ 命令輕鬆移除角色的權限。這與 grant 命令非常相似:
|
1 |
REVOKE permission_type ON table_name FROM user_name; |
與 GRANT 類似,我們可以使用關鍵字 – ‘ALL’ 和 ‘PUBLIC’ 來授予所有權限或將權限授予所有角色:
|
1 |
REVOKE INSERT ON demo FROM PUBLIC; |
如何在 PostgreSQL 中使用群組角色
為了解決廣泛的權限控制,角色具有足夠的彈性,允許與其他角色進行群組。例如,您可以建立一個角色 – ‘temporary_role’,然後將 ‘demo_role’ 和 ‘test_user’ 新增到該角色中:
|
1 2 3 |
CREATE ROLE temporary_role; GRANT temporary_role TO demo_role; GRANT temporary_role TO test_user; |
現在,您只需透過管理 ‘temporary_role’ 角色的權限,即可管理這兩個角色的權限。這使得權限管理更加容易。您可以使用此命令查看角色成員資格資訊:
|
1 |
\du |

任何群組成員都可以透過使用 ‘set role’ 命令來以該群組的身分執行操作。由於 ‘postgres’ 使用者是超級使用者,因此即使您不是該群組的成員,也可以使用 ‘set role’:
|
1 |
SET ROLE temporary_role; |
您現在建立的任何資料表都將歸 temporary_role 所有:
|
1 2 3 4 |
CREATE TABLE hello ( name varchar(25), id serial, start_date date); |
若要檢查資料表的擁有權,請執行以下命令:
|
1 |
\d |

您可以看到 ‘temporary_role’ 角色擁有了新資料表以及與序列 (serial) 資料類型相關聯的序列。若要恢復到原始角色權限,請執行以下命令:
|
1 |
RESET ROLE; |
如果您希望角色擁有其所屬角色的所有權限,可以使用 ‘alter role’ 命令指定 ‘inherit’ 屬性:
|
1 |
ALTER ROLE test_user INHERIT; |
透過上述命令,‘test_user’ 已獲得其所屬角色的所有權限。若要刪除角色,您可以使用 ‘drop role’ 命令:
|
1 |
DROP ROLE temporary_users; |

上述命令會拋出錯誤,因為我們有一些物件(例如資料表 ‘hello’)依賴於它。若要刪除它,您可以將資料表的擁有權轉移給其他角色:
|
1 |
ALTER TABLE hello OWNER TO demo_role; |
您可以使用以下命令檢查 temporary_role 現在是否不擁有任何資料表:
|
1 |
\d |

您現在可以刪除 ‘temporary_role’,因為它現在沒有任何依賴關係:
|
1 |
DROP ROLE temporary_users; |
雖然上述命令會刪除 temporary_users 角色,但該角色群組的前成員並未被移除。
結論
您已完成本教學課程,現在您已瞭解如何在 PostgreSQL 中管理權限。您可以輕鬆地管理這些權限。瞭解如何管理權限可確保您的應用程式能夠存取所需的資料庫,同時無法存取其他應用程式所使用的任何其他資料庫。
祝您運算愉快!


留言
目前尚無留言。成為第一個留言的人吧。