The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Раздел полезных советов: PostgreSQL: безопасность на уровне ..."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Разговоры, обсуждение новостей (Public)
Изначальное сообщение [Проследить за развитием треда]

"Раздел полезных советов: PostgreSQL: безопасность на уровне ..."  
Сообщение от auto_tips on 22-Май-07, 09:36 
Некоторые базы данных, такие как MSSQL и MySQL5, имеют специальные механизмы для разграничения доступа
пользователей к различным ресурсам БД вплоть до ячеек таблиц. PostgreSQL не нуждается в таких излишествах.
На практике обычно требуется разграничить доступ на уровне строк. Для того, что бы сделать это, есть простой способ,
основанный на использовании представлений, правил и функции current_user() или эквивалентного ей
ключевого слова user.

Создадим любую таблицу от имени 'postgres', в которой обязательно должно присутствовать поле
для хранения логина:

   CREATE TABLE table1
   (
     fio text NOT NULL,
     name text,
     something integer,
     login text,
     CONSTRAINT table1_pkey PRIMARY KEY (fio)
   )
   WITHOUT OIDS;
   ALTER TABLE table1 OWNER TO postgres;

Ни один пользователь не имеет никаких привилегий на эту таблицу.

Создадим представление, и дадим необходимым пользователям некоторые привилегии:

   CREATE OR REPLACE VIEW table1v AS
    SELECT table1.fio, table1.name, table1.something
      FROM table1
     WHERE table1.login = user;
   ALTER TABLE table1v OWNER TO postgres;
   GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE table1v TO math_user;

Создадим три правила - для вставки, обновления и удаления строк из представления:

   CREATE OR REPLACE RULE add AS
       ON INSERT TO table1v DO INSTEAD  INSERT INTO table1 (fio, name, something, login)
     VALUES (new.fio, new.name, new.something, user);

   CREATE OR REPLACE RULE upd AS
       ON UPDATE TO table1v DO INSTEAD  UPDATE table1 SET fio = new.fio, name = new.name, something = new.something, login = user
     WHERE table1.login = user;

   CREATE OR REPLACE RULE del AS
       ON DELETE TO table1v DO INSTEAD  DELETE FROM table1 where login=user;

Готово! Теперь пользователь math_user может просматривать или удалять только свои записи
и вставлять или изменять записи только под своим именем.


URL:
Обсуждается: http://www.opennet.ru/tips/info/1420.shtml

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "PostgreSQL: безопасность на уровне строк (row level security..."  
Сообщение от Zert on 22-Май-07, 09:36 
Более уместным будет acl или группы доступа.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "PostgreSQL: безопасность на уровне строк (row level security..."  
Сообщение от mistatog on 23-Май-07, 07:13 
А можете поподробнее написать про acl и группы безопасности, сейчас как раз на постгресе делаю небольшой проект, очень понадобилось бы.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "PostgreSQL: безопасность на уровне строк (row level security..."  
Сообщение от Zert on 23-Май-07, 10:37 
Да Вы сами практически всё написали, а для привязки к этой схеме (одна строка - один юзер) групп пользователей надо добавить лишь дополнительное поле под группу и модифицировать правила под это дело. А с acl я немного погорячился, это, пожалуй, даст увеличение сложности сущностей без сопоставимых результатов.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "PostgreSQL: безопасность на уровне строк (row level security..."  
Сообщение от mistatog on 24-Май-07, 09:45 
Спасибо. Продолжаю, дальше изучать замечательную СУБД postgres
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "PostgreSQL: безопасность на уровне строк (row level security..."  
Сообщение от FLUF (??) on 27-Май-07, 13:07 
ACL - это лист доступа? Тогда ты совсем погорячился ^_^ Привилегии можно поставить на то, что имеет OID. Строки в pg OID-а не имеют. И потому привилегии на конкретную строку поставить нелься. А в других БД можно. Но в pg это и не нужно, потому что это можно реализовать через вьюшки и всё прекрасно и надёжно.
Идею я взял с забугорного сайта. Там чел сдела так, что бы юзверь не мог удалить из таблицы не свои строки. Я прибавил к этому, что бы он их и прочитать (select) не мог.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "PostgreSQL: безопасность на уровне строк (row level security..."  
Сообщение от illi on 13-Июн-07, 12:18 
>ACL - это лист доступа? Тогда ты совсем погорячился ^_^ Привилегии можно
>поставить на то, что имеет OID. Строки в pg OID-а не
>имеют.

Ну, это не совсем так:
uadm=# create table test (tt int4) WITH OIDS;
CREATE TABLE
uadm=# INSERT INTO test VALUES (11);
INSERT 2031626 1
uadm=# select * from test;
tt
----
11

uadm=# select oid from test;
   oid
---------
2031626
Просто _СЕЙЧАС_ они не имеют oid-а в созданных по дефолту таблицах.
Раньше(не помню, до какой версии) дефолтом создавались с OID.
И - oid по "select *" не возвращается.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру