2015-09-14 2 views
0

Я отвечаю за базу данных PostgreSQL для университетского курса с 23 пользователями и 23 базами данных. Каждый пользователь должен иметь доступ только к одной базе данных, и если они пытаются подключиться к другому, они должны получить отказ в доступе. У меня уже был рабочий набор, но нам пришлось отформатировать сервер. Теперь я пытаюсь сделать то же самое, но каждый пользователь имеет доступ к базам данных друг друга. Я уже пробовал:Отмена доступа к базе данных не работает

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

И еще я могу подключиться к базе данных group1 любым способом:

psql -d group1 

или

\c group1 

Как я могу остановить это происходит?

Редактировать: Я использую PostgreSQL 9.3.9. Что я делаю, это войти в систему с правами администратора, а затем изменить пользователя по группе 3:

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 для создания пользователей. Он использовал createuser с -s, когда он должен был быть -S, поэтому они не являются суперпользователями. Второй запрос нашел сбой. –

+0

@CristianEduardoLehuedeLyon: поскольку ['-S' является стандартным для' createuser'] (http://www.postgresql.org/docs/current/interactive/app-createuser.html), вы можете полностью отказаться от этой опции, чтобы избежать путаницы , –

1

это:

REVOKE ALL PRIVILEGES ON DATABASE group1 FROM PUBLIC; 

должно быть достаточно, если вы не создали group3 в качестве привилегированного пользователя.