Hey Tony,

2010/10/22 Tony Cebzanov <tony...@andrew.cmu.edu>

> Hi Dmitriy,
>
> On 10/21/10 4:21 PM, Dmitriy Igrishin wrote:
> > IMO, you are trying to reinvent the wheel. Although, you may do it just
> for
> > fun. :-)
>
> Surely I am, but I think it made sense at the time.  It doesn't make as
> much sense now that I need to audit every insert/update/delete in the
> database.
>
> > Why not just create "groups" via CREATE ROLE User ... and grants this
> > roles to the "users" (created via CREATE USER or CREATE ROLE ... LOGIN)Â
>  ?
>
> The reason I shied away from this initially was the overhead of having
> to maintain user info in two places (the pg_catalog schema for postgres
> users, and in my application schema, with the user's real name,
> application preferences, etc.)  It also seemed like the role information
> wasn't very accessible in the system catalogs -- I had noticed that the
> pg_group view was deprecated, and the query to get group information out
> of the pg_auth_members and pg_roles tables started to look very ugly,
> when I could just do a quick "is the user an administrator" check via a
> boolean flag in my app user's table.
>
You table, e.g. "usr" and the systems table with roles will have 1:1
cardinality.
That's all. There is no redundancy and / or overhead. You just extends the
system table with columns you need and create implicitly 1:1 relation by
placing a column "rolename" with unique index in you "usr" table.


>
> With my new requirements for auditing, using the database's roles makes
> more sense, but I still see some problems with it, even if I can solve
> the connection pooling problem by using persistent connections as you
> suggest.
>
> For one thing, in this app, all higher permissions include the lower
> permissions -- all administrators are auditors and regular users, and
> all auditors are regular users.  So, my normal instinct would be to set
> it up like this:
>
> GRANT g_user TO g_auditor WITH ADMIN OPTION;
> GRANT g_auditor TO g_admin WITH ADMIN OPTION;
>
> Then, in theory, I could grant administrators the g_admin group,
> auditors the g_auditor group, etc. and they could do all the things the
> lower groups can.  BUT, in my app, to check for access to audit
> functions, I can't do a simple query to see if the user is in the
> "g_auditor" group, because administrators aren't explicitly granted this
> group -- they get those permissions implicitly, but how do I know this
> from my application?  Is there some kind of query I can do to get back
> all the groups a role is a member of?
>

Please see
http://www.postgresql.org/docs/9.0/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE


-- 
// Dmitriy.

Reply via email to