Как реализовать UNIX как ACL для строк таблицы - PullRequest
0 голосов
/ 05 февраля 2020

Я новичок sql, поэтому, пожалуйста, прости меня за то, что я задал тупой вопрос. Я создаю свое первое реальное приложение для проекта колледжа.

По своей сути, оно должно обрабатывать более тысячи пользователей, которые не могут читать или записывать данные друг друга, если им не предоставлены привилегии. как Linux делает с пользователем и группами.

в приведенной ниже схеме, которую я пробовал, пользователь может просматривать (читать) и редактировать (писать) других пользователей, если у них есть разрешения на чтение. (r = 2 w = 1 r + w = ​​3).

например, если cgroup_1 - администратор, а cgroup_2 - менеджер, а unixperm - 32, то это означает, что пользователи в группе администраторов могут читать + писать (3), а пользователи в Группа менеджеров может только читать (2)

create table cgroups
(
    id int unsigned primary key auto_increment,
    title varchar(100) not null unique,

    cunixperm  tinyint unsigned not null default 32 ,# r=2 w=1
    cgroup_1   int unsigned not null default 1 references cgroups (id) on delete cascade on update cascade,
    cgroup_2   int unsigned references cgroups (id) on delete cascade on update cascade
);


create table users
(
    id          int unsigned auto_increment primary key,
    username    varchar(255) not null unique,

    cunixperm  tinyint unsigned not null default 30, # r=2 w=1 3=r+w
    cgroup_1   int unsigned default 1 not null references cgroups (id) on delete cascade on update cascade ,
    cgroup_2   int unsigned references cgroups (id) on delete cascade on update cascade
);

create table many_users_in_many_cgroups
(
    user_id int unsigned references users(id),
    cgroup_id int unsigned references cgroups(id),
    primary key (user_id,cgroup_id)
);


insert into cgroups(title)
values ('admins'),('managers'),('writers');

insert into users(username, cunixperm, cgroup_1, cgroup_2)
values ('user1',30,1,null),
       ('user2',30,1,2),
       ('user3',22,2,2),
       ('user4',02,3,3);

insert into many_users_in_many_cgroups
values (1,1),(2,2),(3,3),(4,4);

Теперь предположим, что пользователь 2 вошел в мое приложение, Как я могу показать только те строки пользователя, для которых у него есть разрешения на чтение (2) или чтение + запись (3) .

если приведенная выше схема не является (вероятно) подходящей, пожалуйста, дайте мне пример с соответствующей схемой

В настоящее время я использую MariaDB, но открыт для решений и для других.

1 Ответ

1 голос
/ 06 февраля 2020

Краткий ответ: управление частью доступа встроено в приложение.

Механизм должен l ie снаружи SQL, поскольку SQL может (обычно) предоставлять доступ только к таблице. уровень, а не строка или столбец.

Что касается того, как именно его запрограммировать, один из способов был бы следующим. Предположим, у вас есть такая таблица данных (я использую псевдо SQL, потому что я не помню точный синтаксис Mysql):

Create table data (
rowid unique auto-increment,
datafield text);

Create table data_acl(
rowid foreign key references data (rowid),
cgroup references cgroups(id),
permissions int);

Это предполагает, что все пользователи находятся в некоторой группе, таким образом, чтобы предоставить доступ пользователю, вы предоставляете доступ к cgroup. Это упрощает и следует идее Unix о том, что каждый пользователь имеет свою собственную группу.

Ваша таблица пользователей должна содержать только имена пользователей.

Ваша таблица cgroups должна содержать только список пользователей и group.

Create table cgroups (
Id autoincrement int,
name);

Create table cgroup_users (
user_id foreign key references users(id),
cgroup_id foreign key references cgroups(id)
);

Теперь, чтобы просмотреть все строки данных, пользователь имеет к вам доступ:

Select distinct datafield,acl.permissions from data d, data_acl acl, cgroups g 
Where d.rowid=acl.rowid and acl.cgroup in (select distinct cgroup_id from cgroup_users where user_id=?)

Извините за форматирование, отправив это с мобильного телефона.

...