Re: Different views with same name for different users - Mailing list pgsql-general

From Steve Boyle \(Roselink\)
Subject Re: Different views with same name for different users
Date
Msg-id 003201c19eae$9baae190$c55869d5@dualtower
Whole thread Raw
In response to Different views with same name for different users  ("Harald Massa" <HaraldMassa@ghum.de>)
List pgsql-general
Harald,

Possible method to implement security that I think matches your requirements
follows, please feel free to comment:-

(
Notes:
 ------
    I have only implemented the 'select' view the model could be easily
expanded to cope with different             security permissions.
    I have added the notion of user groups for convenience.
    You could probably do something similar hooking into the pg_tables,
there are would be pros and             cons if you did that.
    You would probably want to modify the keys / foreign keys before using
the model (i.e. I've set them         all as varchar(50).
)

hih

steve boyle

-- create tables
create table users (
    user_id varchar(50),
    primary key (user_id)
);

create table items (
    item_id varchar(50),
    primary key (item_id)
);

create table groups (
    group_id    varchar(50),
    primary key (group_id)
);

create table user_groups (
    fk_user_id  varchar(50),
    fk_group_id varchar(50),
    primary key (fk_user_id,fk_group_id)
);

create table item_group_permissions (
    fk_group_id varchar(50),
    fk_item_id  varchar(50),
    canselect   bool default true,
    canupdate   bool default false,
    candelete   bool default false,
    primary key (fk_group_id,fk_item_id)
);

-- add foreign key constraints
alter table user_groups add constraint fk_groups_user_groups_group_id
foreign key (fk_group_id)
    references groups(group_id)
    on update cascade
    not deferrable
    initially immediate;

alter table user_groups add constraint fk_users_user_groups_user_id
foreign key (fk_user_id)
    references users(user_id)
    on update cascade
    not deferrable
    initially immediate;

alter table item_group_permissions add constraint
fk_groups_item_group_permissions_group_id
foreign key (fk_group_id)
    references groups(group_id)
    on update cascade
    not deferrable
    initially immediate;

alter table item_group_permissions add constraint
fk_items_item_group_permissions_item_id
foreign key (fk_item_id)
    references items(item_id)
    on update cascade
    not deferrable
    initially immediate;

-- insert demo data

insert into items (item_id) values ('item 1');
insert into items (item_id) values ('item 2');
insert into items (item_id) values ('item 3');

insert into users (user_id) values ('user 1');
insert into users (user_id) values ('user 2');
insert into users (user_id) values ('user 3');
insert into users (user_id) values ('user 4');

insert into groups (group_id) values ('group 1');
insert into groups (group_id) values ('group 2');
insert into groups (group_id) values ('group 3');

insert into user_groups(fk_user_id, fk_group_id) values ('user 1', 'group
1');
insert into user_groups(fk_user_id, fk_group_id) values ('user 2', 'group
2');
insert into user_groups(fk_user_id, fk_group_id) values ('user 3', 'group
3');
insert into user_groups(fk_user_id, fk_group_id) values ('user 4', 'group
1');
insert into user_groups(fk_user_id, fk_group_id) values ('user 4', 'group
2');

insert into item_group_permissions
    (fk_group_id, fk_item_id, canselect, canupdate, candelete) values
    ('group 1', 'item 1', 'T', 'T', 'T');
insert into item_group_permissions
    (fk_group_id, fk_item_id, canselect, canupdate, candelete) values
    ('group 2', 'item 2', 'T', 'T', 'T');
insert into item_group_permissions
    (fk_group_id, fk_item_id, canselect, canupdate, candelete) values
    ('group 3', 'item 3', 'T', 'T', 'T');
insert into item_group_permissions
    (fk_group_id, fk_item_id, canselect, canupdate, candelete) values
    ('group 2', 'item 1', 'T', 'F', 'F');
insert into item_group_permissions
    (fk_group_id, fk_item_id, canselect, canupdate, candelete) values
    ('group 3', 'item 1', 'T', 'F', 'F');
insert into item_group_permissions
    (fk_group_id, fk_item_id, canselect, canupdate, candelete) values
    ('group 2', 'item 3', 'T', 'F', 'F');
insert into item_group_permissions
    (fk_group_id, fk_item_id, canselect, canupdate, candelete) values
    ('group 3', 'item 2', 'T', 'F', 'F');

-- create permission api views

create view usr_select_items as
select distinct items.item_id, item_group_permissions.canselect,
users.user_id
from users inner join
    items
    inner join
        groups
            inner join item_group_permissions on
                groups.group_id = item_group_permissions.fk_group_id
            inner join user_groups
                on groups.group_id = user_groups.fk_group_id
        on items.item_id = item_group_permissions.fk_item_id
    on users.user_id = user_groups.fk_user_id
where
    item_group_permissions.canselect='T' and
users.user_id::text=getpgusername()::text
order by items.item_id;

-- Other api permission views could follow

----- Original Message -----
From: "Harald Massa" <HaraldMassa@ghum.de>
To: <pgsql-general@postgresql.org>
Sent: Wednesday, January 16, 2002 1:21 PM
Subject: [GENERAL] Different views with same name for different users


> Hello,
>
> i've got a table of around 10.000 records.
>
> Users A, B, C are allowed to see all the records
>
> user D only some
> user E only some others
>
> To take logic away from the application to the database,
> I would like to have a view as
>
> for user D:
> CREATE VIEW PERS as SELECT * FROM TOTALDATABASE where (criteria for
viewable
> user D)
>
> for user E:
> CREATE VIEW PERS as SELECT * FROM TOTALDATABASE where (criteria for
viewable
> user E)
>
> for users A, B, C
> CREATE VIEW PERS as SELECT * FROM TOTALDATABASE
>
> so in my application I can do alll the SELECTS on PERS ... which looks
> different for every user.
>
> Which is the most elegant way to do this?
> (is there any way at all????)
>
> Tnx
>
> Harald
>
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
>


pgsql-general by date:

Previous
From: "Mitch Vincent"
Date:
Subject: Re: PQsendQuery: Query is too long
Next
From: "Jeffrey W. Baker"
Date:
Subject: Meaning of vacuum output