2015-09-14 26 views
0

我負責一個擁有23個用戶和23個數據庫的大學課程的PostgreSQL數據庫。每個用戶只能訪問一個數據庫,如果他們嘗試連接到另一個數據庫,他們應該拒絕訪問。 我已經有一個工作集,但我們不得不格式化服務器。現在我試圖做同樣的事情,但每個用戶都可以訪問其他數據庫。我已經嘗試過:撤銷對數據庫的訪問似乎不起作用

REVOKE connect ON DATABASE group1 FROM PUBLIC; 
REVOKE ALL PRIVILEGES ON DATABASE group1 FROM PUBLIC; 
REVOKE ALL PRIVILEGES ON DATABASE group1 FROM group3; 

而且還是我以任何方式是能夠連接到數據庫組別:

psql -d group1 

\c group1 

我怎樣才能阻止這種情況的發生?

編輯:我正在使用PostgreSQL 9.3.9。

sudo su - 
su group3 
psql 
Enter password: 
\c group1 
You are now connected to database "group1" as user "group3". 
+2

誰是「你」?如果以超級用戶身份進行連接,則您總是可以訪問。 (並*總是*提及您的Postgres版本。) –

+0

顯示'\ l + group1'和'\ du + group3'輸出請 –

回答

1

到目前爲止我們所看到的無法解釋會發生什麼。 (!遞歸)

如果您的用戶group3已被授予其他角色(在其他角色的成員),並與其他角色的人進入這可以解釋它:

SELECT r0.rolname AS parent, r1.rolname AS member 
FROM pg_roles r0 
JOIN pg_auth_members m ON m.roleid = r0.oid 
JOIN pg_roles r1 ON r1.oid = m.member 
WHERE r1.rolname = 'group3'; 

或者,如果group3有超級特權:

SELECT rolname, rolsuper 
FROM pg_roles 
WHERE rolname = 'group3'; 
+0

我在.sh文件中找到毛刺來創建用戶。當它應該是-S時,它使用createuser和-s,所以它們不是超級用戶。你的第二個查詢發現故障。 –

+0

@CristianEduardoLehuedeLyon:由於['-S'是'createuser'的默認值](http://www.postgresql.org/docs/current/interactive/app-createuser.html),您可以完全放棄該選項以避免混淆。 –

1

此: 我要做的就是以root身份登錄,然後更改用戶組3

REVOKE ALL PRIVILEGES ON DATABASE group1 FROM PUBLIC; 

應該是足夠的,除非你創建group3作爲一個超級用戶。