Управление правами на уровне строк и столбцов

YMatrix поддерживает управление правами на уровне строк и столбцов с использованием представлений (views). Создавая представления, вы можете ограничить доступ пользователей к определённым строкам и столбцам. Представление может включать только те строки и столбцы, к которым у пользователя есть разрешение, тем самым скрывая конфиденциальные данные.

В этом разделе демонстрируется управление правами на уровне строк и столбцов на основе простого примера.

1. Создание таблицы

Создайте тестовую таблицу и вставьте образцы данных.

drop table if exists salary cascade;
create table salary (
         id int
        ,name varchar(100)
        ,amount numeric
        ,users varchar
) distributed by (id);

insert into salary values(1,'Zhang',5000,'mxzz1'),(2,'Li',6000,'mxzz2');

2. Управление правами на уровне строк

  • Создайте тестовых пользователей
drop user mxzz1;
drop user mxzz2;
create user mxzz1 with password '123123';
create user mxzz2 with password '123123';
  • Создайте представление
create or replace view user_salary as 
select * from salary
where users = user::varchar(64);
  • Назначьте права доступа
grant select on table user_salary to mxzz1;
grant select on table user_salary to mxzz2;
  • Запросите данные от имени пользователя mxzz1
-- Test query
psql postgres -h 127.0.0.1 -U mxzz1

-- Returns only salary information for mxzz1
select * from user_salary;

id | name  | amount | users 
---|-------|--------|-------
1  | Zhang |  5000  | mxzz1 
  • Запросите данные от имени пользователя mxzz2
-- Test query 2
psql postgres -h 127.0.0.1 -U mxzz2

-- Returns only salary information for mxzz2
select * from user_salary;

id | name | amount | users 
---|------|--------|-------
2  | Li   |  6000  | mxzz2

3. Управление правами на уровне столбцов

  • Создайте тестовых пользователей
drop user lingdao;
drop user commonuser;
create user lingdao with password '123123';
create user commonuser with password '123123';
  • Отзовите права публичного доступа к таблице
revoke all ON salary from public;
  • Назначьте права на уровне столбцов
grant select(id,name,users) on table salary to lingdao;
grant select(id,name,amount,users) on table salary to commonuser;
  • Запросите данные от имени пользователя lingdao
psql postgres -h 127.0.0.1 -U lingdao

-- Full table query fails
select * from salary;
ERROR: permission denied for table salary

-- Query on granted columns succeeds
select id,name,users from salary;

id |  name | users 
---|-------|-------
1  | Zhang | mxzz1 
2  |  LI   | mxzz2 
  • Запросите данные от имени пользователя commonuser
psql postgres -h 127.0.0.1 -U commonuser

-- Full table query succeeds
select * from salary;

id |  name | amount | users 
---|-------|--------|-------
1  | Zhang |  5000  | mxzz1 
2  |  Li   |  6000  | mxzz2