Re: Разделение прав

From: Oleg Bartunov <oleg(at)sai(dot)msu(dot)su>
To: "Andrey N(dot) Oktyabrski" <ano(at)antora(dot)ru>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Разделение прав
Date: 2006-02-14 15:43:43
Message-ID: Pine.GSO.4.63.0602141834160.19213@ra.sai.msu.su
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

Андрей,

ты бы не поленился, а сделал бы примитивный пример для cut'n paste
технологии, чтобы не корячиться самому. А то написал что-то на псевдоязыке
(да еще и неправильно), и хочешь, чтобы тебе помогли.
То, что ьы хочешь называется 'updateable view'. В pgsql нет полной реализации
'create view', поэтому вот так просто ничего не сделаешь
Но если не ты поленишься и пойдешь на
http://pgsql.ru/db/pgsearch/index.html?q=updateable+view&tmpl=%F0%D2%C9%D7%C5%D4&ps=10&set=&group=2&site=
то найдешь кучу полезного. В частности
http://www.varlena.com/varlena/GeneralBits/111.php

Олег
On Tue, 14 Feb 2006, Andrey N. Oktyabrski wrote:

> Andrey N. Oktyabrski wrote:
>> Здравствуйте.
>>
>> Стоит такая задача:
>> есть несколько таблиц, записи в них имеют признак типа "такой-то юзер
>> постгреса имеет право на select/update этой записи", надо сделать как-то,
>> чтобы юзер не мог сделать то, что ему запрещено.
>>
>> Я планировал сделать это так:
>> create table _tbl (...);
>> create view tbl as select * from _tbl where owner = session_user();
>> revoke all on tbl from <юзер>;
>> grant select on tbl to <юзер>;
>> revoke all on _tbl from <юзер>;
>> grant insert, update, delete on _tbl to <юзер>;
>>
>> Но тогда
>> update _tbl set fld = 123 where id = 21;
>> не работает - постгрес говорит, что нет прав. grant select on _tbl to
>> <юзер> спасает, но я не хочу чтобы юзер читал из таблицы, для этого сделано
>> представление-подмножество таблицы.
>>
>> Как выйти из положения? Или есть какое-то решение без view?
> Да, мысль пришла... Может ли кто-нибудь подсказать, в каком месте хачить
> исходники постгреса на предмет разрешения update без прав на select? С целью
> соорудить патч и попытаться попросить Олега закоммитить его :-) Если это,
> конечно, politically correct solution.
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: Don't 'kill -9' the postmaster
>

Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg(at)sai(dot)msu(dot)su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
>From pgsql-ru-general-owner(at)postgresql(dot)org Thu Feb 16 08:06:23 2006
X-Original-To: pgsql-ru-general-postgresql(dot)org(at)localhost(dot)postgresql(dot)org
Received: from localhost (av.hub.org [200.46.204.144])
by postgresql.org (Postfix) with ESMTP id 7D86A9DCC4F
for <pgsql-ru-general-postgresql(dot)org(at)localhost(dot)postgresql(dot)org>; Thu, 16 Feb 2006 08:06:22 -0400 (AST)
Received: from postgresql.org ([200.46.204.71])
by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024)
with ESMTP id 72706-01
for <pgsql-ru-general-postgresql(dot)org(at)localhost(dot)postgresql(dot)org>;
Thu, 16 Feb 2006 08:06:24 -0400 (AST)
Received: from svr4.postgresql.org (svr4.postgresql.org [66.98.251.159])
by postgresql.org (Postfix) with ESMTP id 976E09DCACD
for <pgsql-ru-general(at)postgresql(dot)org>; Thu, 16 Feb 2006 08:06:19 -0400 (AST)
Received: from office.antora.ru (62.183.41.253.dsl.kuban.ru [62.183.41.253])
by svr4.postgresql.org (Postfix) with ESMTP id 21C915AF1FA
for <pgsql-ru-general(at)postgresql(dot)org>; Thu, 16 Feb 2006 12:06:20 +0000 (GMT)
Received: from [192.168.1.111] (helo=[192.168.1.111])
by office.antora.ru with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256)
(Exim 4.51)
id 1F9hzF-0001ad-RQ; Thu, 16 Feb 2006 15:11:54 +0300
Message-ID: <43F46A94(dot)8040503(at)antora(dot)ru>
Date: Thu, 16 Feb 2006 15:05:40 +0300
From: "Andrey N. Oktyabrski" <ano(at)antora(dot)ru>
User-Agent: Thunderbird 1.5 (X11/20060130)
MIME-Version: 1.0
To: Oleg Bartunov <oleg(at)sai(dot)msu(dot)su>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: =?KOI8-R?Q?=F2=C1=DA=C4=C5=CC=C5=CE=C9=C5?=
References: <43F1BB57(dot)8070608(at)antora(dot)ru> <43F1EE8D(dot)30806(at)antora(dot)ru> <Pine(dot)GSO(dot)4(dot)63(dot)0602141834160(dot)19213(at)ra(dot)sai(dot)msu(dot)su>
In-Reply-To: <Pine(dot)GSO(dot)4(dot)63(dot)0602141834160(dot)19213(at)ra(dot)sai(dot)msu(dot)su>
Content-Type: text/plain; charset=KOI8-R; format=flowed
Content-Transfer-Encoding: 8bit
X-Virus-Scanned: by amavisd-new at hub.org
X-Spam-Status: No, score=1.543 required=5 tests=[SUBJECT_ENCODED_TWICE=1.543]
X-Spam-Score: 1.543
X-Spam-Level: *
X-Archive-Number: 200602/10
X-Sequence-Number: 504

Oleg Bartunov wrote:
> ты бы не поленился, а сделал бы примитивный пример для cut'n paste
> технологии, чтобы не корячиться самому. А то написал что-то на псевдоязыке
Так пойдёт?
qq=# CREATE USER qq;
CREATE ROLE
qq=# CREATE TABLE t (i serial not null primary key, a text);
NOTICE: CREATE TABLE создаст подразумеваемую последовательность
"t_i_seq" для serial-колонки "t.i"
NOTICE: CREATE TABLE / PRIMARY KEY создаст подразумеваемый индекс
"t_pkey" для таблицы "t"
CREATE TABLE
qq=# CREATE VIEW v AS SELECT * FROM t WHERE a = session_user;
CREATE VIEW
qq=# INSERT INTO t (a) VALUES ('qq');
INSERT 0 1
qq=# INSERT INTO t (a) VALUES ('ano');
INSERT 0 1
qq=# REVOKE ALL ON t, v FROM qq;
REVOKE
qq=# GRANT insert, update, delete ON t TO qq;
GRANT
qq=# GRANT select ON v TO qq;
GRANT
qq=# GRANT select, update ON t_i_seq TO qq;
GRANT
qq=# \c qq qq
Вы подсоединились к базе данных "qq" как пользователь "qq".
qq=> INSERT INTO t (a) VALUES ('qq');
INSERT 0 1
qq=> SELECT * FROM t;
ERROR: доступ запрещён для связи t
qq=> SELECT * FROM v;
i | a
----+----
1 | qq
3 | qq
(записей: 2)
qq=> UPDATE t SET a = 'ano' where i = 3;
ERROR: доступ запрещён для связи t
qq=> DELETE FROM t where i > 2;
ERROR: доступ запрещён для связи t

Потому я и хочу возможность update/delete без необходимости разрешения
select.

> (да еще и неправильно), и хочешь, чтобы тебе помогли. То, что ьы хочешь
А что там неправильно?

> называется 'updateable view'. В pgsql нет полной реализации
> 'create view', поэтому вот так просто ничего не сделаешь
Эт я в курсе, не первый год жду, как и переменных для транзакций :-)
Потому и пытаюсь найти более-менее эквивалентную замену.

> Но если не ты поленишься и пойдешь на
> http://pgsql.ru/db/pgsearch/index.html?q=updateable+view&tmpl=%F0%D2%C9%D7%C5%D4&ps=10&set=&group=2&site=
> то найдешь кучу полезного. В частности
> http://www.varlena.com/varlena/GeneralBits/111.php
Был и там, и там. Если не выйдет как-то более красиво, придётся
придумать что-то подобное. Но это получится громоздко и сильно зависимо
от структуры базы. Если в какой-то момент времени одна из таблиц
изменится, надо будет проверить и поправить всё это нагромождение.

Тогда уж мне больше подойдёт вот это
http://pgfoundry.org/projects/veil/

Правда, тоже не особо красивое произведение (пока?), да и смущает вот что:
# Development Status: 3 - Alpha
...
Registered: 2005-09-13 18:45
Activity Percentile: 0%

>>> Стоит такая задача:
>>> есть несколько таблиц, записи в них имеют признак типа "такой-то юзер
>>> постгреса имеет право на select/update этой записи", надо сделать
>>> как-то, чтобы юзер не мог сделать то, что ему запрещено.
>>>
>>> Я планировал сделать это так:
>>> create table _tbl (...);
>>> create view tbl as select * from _tbl where owner = session_user();
>>> revoke all on tbl from <юзер>;
>>> grant select on tbl to <юзер>;
>>> revoke all on _tbl from <юзер>;
>>> grant insert, update, delete on _tbl to <юзер>;
>>>
>>> Но тогда
>>> update _tbl set fld = 123 where id = 21;
>>> не работает - постгрес говорит, что нет прав. grant select on _tbl to
>>> <юзер> спасает, но я не хочу чтобы юзер читал из таблицы, для этого
>>> сделано представление-подмножество таблицы.
>>>
>>> Как выйти из положения? Или есть какое-то решение без view?
>> Да, мысль пришла... Может ли кто-нибудь подсказать, в каком месте
>> хачить исходники постгреса на предмет разрешения update без прав на
>> select? С целью соорудить патч и попытаться попросить Олега
>> закоммитить его :-) Если это, конечно, politically correct solution.

In response to

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Andrey N. Oktyabrski 2006-02-17 11:59:03 Re: Разделение
Previous Message Andrey N. Oktyabrski 2006-02-14 14:51:57 Re: Разделение прав