Обсуждение: Restricting access to rows?

Поиск
Список
Период
Сортировка

Restricting access to rows?

От
Benjamin Smith
Дата:
We have a growing ASP-hosted application built on PHP/Postgres 8.1, and are
getting requests from clients to manipulate the databases more directly.
However, the structure of our databases prevents this from happening readily.

Assume I have two tables configured thusly:

create table customers (
    id serial unique not null,
    name varchar not null
    );

create table widgets (
    customers_id integer not null references customers(id),
    name varchar not null,
    value real not null default 0
    );

insert into customers (name) values ('Bob');
insert into customers (name) values ('Jane');
insert into widgets (customers_id, name, value) VALUES (1, 'Foo', 100);
insert into widgets (customers_id, name, value) VALUES (1, 'Bar', 50);
insert into widgets (customers_id, name, value) VALUES (2, 'Bleeb', 500);

This leaves us with two customers, Bob who has two widgets worth $150, and
Jane with one widget worth $500.

How can I set up a user so that Bob can update his records, without letting
Bob update Jane's records? Is it possible, say with a view or some other
intermediate data type?

Thanks,

-Ben
--
"The best way to predict the future is to invent it."
- XEROX PARC slogan, circa 1978

Re: Restricting access to rows?

От
Andreas Kretschmer
Дата:
Benjamin Smith <lists@benjamindsmith.com> schrieb:
> How can I set up a user so that Bob can update his records, without letting
> Bob update Jane's records? Is it possible, say with a view or some other
> intermediate data type?

You can use a VIEW to select all rows for CURRENT_USER, and then create
RULES for this view to do INSERT, UPDATE and DELETE.

A nice framework for row-level access-control is 'veil':
http://pgfoundry.org/projects/veil


HTH, Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect.                              (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly."    (unknow)
Kaufbach, Saxony, Germany, Europe.              N 51.05082°, E 13.56889°

Re: Restricting access to rows?

От
Greg Stark
Дата:
Benjamin Smith <lists@benjamindsmith.com> writes:

> How can I set up a user so that Bob can update his records, without letting
> Bob update Jane's records? Is it possible, say with a view or some other
> intermediate data type?

It's not hard to give them access to *view* their records using a view. You
just create the view with WHERE customer_id = .. and then grant SELECT access
to that view but not the underlying table.

In theory that would be enough to give them update access as well. However
Postgres doesn't yet support updateable views, at least not automatically.

You would have to write rules for each view to implement updateable views
which isn't hard but would get pretty tiresome if you're doing this for a lot
of tables and a lot of clients.

There was a project around where someone had implemented some scripts to do
this automatically. You might be able to find it searching back through the
lists.

There are also people interested in working on it as a built-in feature for
Postgres, but I don't think there's any time-line on though or even any
preliminary results yet, so I wouldn't depend on it any time soon.

--
greg

Re: Restricting access to rows?

От
Rafal Pietrak
Дата:
Hi,

Are there any plans to make CREATE USER local to a database? (as opposed
to CLUSTER scope, as it is today)

So that in such cases as Benjamin's, the ISP could satisfy customer
requests by createing and handing over the new database instance within
the managed cluster? Even with the unrestricted CREATE USER privileges?

-R

On Fri, 2006-05-26 at 07:39 +0200, Andreas Kretschmer wrote:
> Benjamin Smith <lists@benjamindsmith.com> schrieb:
> > How can I set up a user so that Bob can update his records, without letting
> > Bob update Jane's records? Is it possible, say with a view or some other
> > intermediate data type?
>
> You can use a VIEW to select all rows for CURRENT_USER, and then create
> RULES for this view to do INSERT, UPDATE and DELETE.
>
> A nice framework for row-level access-control is 'veil':
> http://pgfoundry.org/projects/veil
>
>
> HTH, Andreas
--
-R

Re: Restricting access to rows?

От
Richard Huxton
Дата:
Greg Stark wrote:
> There are also people interested in working on it as a built-in feature for
> Postgres, but I don't think there's any time-line on though or even any
> preliminary results yet, so I wouldn't depend on it any time soon.

Actually, there is a patch which works for some cases. Not sure if it
will make it into 8.2 though.

--
   Richard Huxton
   Archonet Ltd

Re: Restricting access to rows?

От
"Josue E. Maldonado"
Дата:
Benjamin Smith wrote:
> How can I set up a user so that Bob can update his records, without letting
> Bob update Jane's records? Is it possible, say with a view or some other
> intermediate data type?

I've done something similar using a separate control table where I set
what accounts an user can "see", then I wrote a psql that returns just
the rows for that especific user, it could also be done with pure SQL
joins tough.



--
Sinceramente,
Josué Maldonado.

... "Si me engañas una vez, tuya es la culpa. Si me engañas dos, la
culpa es mía." -- Anaxágoras.

Re: Restricting access to rows?

От
Kenneth Downs
Дата:
Josue E. Maldonado wrote:

> Benjamin Smith wrote:
>
>> How can I set up a user so that Bob can update his records, without
>> letting Bob update Jane's records? Is it possible, say with a view or
>> some other intermediate data type?
>
>
> I've done something similar using a separate control table where I set
> what accounts an user can "see", then I wrote a psql that returns just
> the rows for that especific user, it could also be done with pure SQL
> joins tough.
>
>
>
You can put in a some triggers that do a few things, and I think a rule
on SELECT will round it off.

on Insert: populate a column with CURRENT_USER
on Update and Delete: refuse unless CURRENT_USER matches the column
on SELECT rules, apply a filter that column = CURRENT_USER

You also may put in an override for all three that if the CURRENT_USER
is in some particular group these filters will not apply.  One level
might be just for selects, a higher level for updates/deletes.

Or you can do the reverse, and say that these filters only apply if the
user is in a certain group.

Вложения

Re: Restricting access to rows?

От
Tom Lane
Дата:
Rafal Pietrak <rafal@zorro.isa-geek.com> writes:
> Are there any plans to make CREATE USER local to a database?

No.

There is the db_user_namespace configuration parameter, but it's a bit
of an ugly kluge if you ask me ...

            regards, tom lane

Re: Restricting access to rows?

От
Rafal Pietrak
Дата:
On Fri, 2006-05-26 at 10:25 -0400, Tom Lane wrote:
> There is the db_user_namespace configuration parameter, but it's a bit
> of an ugly kluge if you ask me ...

Haven't noticed that.

But a superuser@dataabase1, still can create a user@database2 - so it's
of no use for privilege separation. Pity.

--
-R

Re: Restricting access to rows?

От
"codeWarrior"
Дата:
You are apparently dealing with the downside of co-mingling your clients
data... maybe you should seriously consider revising your approach and
giving each client either separate databases or separate schema's within a
given database --

This is why co-mingling should be avoided...

I'd push for the former -- that way -- you can use a template database
instead of hoping that all of your filters, rules, views, etc are
accurate...



"Benjamin Smith" <lists@benjamindsmith.com> wrote in message
news:200605252155.52906.lists@benjamindsmith.com...
> We have a growing ASP-hosted application built on PHP/Postgres 8.1, and
> are
> getting requests from clients to manipulate the databases more directly.
> However, the structure of our databases prevents this from happening
> readily.
>
> Assume I have two tables configured thusly:
>
> create table customers (
> id serial unique not null,
> name varchar not null
> );
>
> create table widgets (
> customers_id integer not null references customers(id),
> name varchar not null,
> value real not null default 0
> );
>
> insert into customers (name) values ('Bob');
> insert into customers (name) values ('Jane');
> insert into widgets (customers_id, name, value) VALUES (1, 'Foo', 100);
> insert into widgets (customers_id, name, value) VALUES (1, 'Bar', 50);
> insert into widgets (customers_id, name, value) VALUES (2, 'Bleeb', 500);
>
> This leaves us with two customers, Bob who has two widgets worth $150, and
> Jane with one widget worth $500.
>
> How can I set up a user so that Bob can update his records, without
> letting
> Bob update Jane's records? Is it possible, say with a view or some other
> intermediate data type?
>
> Thanks,
>
> -Ben
> --
> "The best way to predict the future is to invent it."
> - XEROX PARC slogan, circa 1978
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Have you searched our list archives?
>
>               http://archives.postgresql.org
>