2013-07-10 2 views
0

В моем приложении запросчик имеет разрешение запрашивать только определенные столбцы. Столбцы могут отличаться между запрашивающими. Предложение where изменяется между запросами, чтобы возвращаемые строки изменялись с каждым запросом. Каков наилучший способ управления этим контролем доступа? Должен ли я использовать массив для хранения разрешенных столбцов, а затем выполнить проверку в моем приложении?Как ограничить столбцы SQL на основе идентификатора запроса?

Я на PostgreSQL 9.x

Пример: У нас есть медицинские работники, которые могут получить доступ к записи пациентов, но не все медицинские работники должны быть в состоянии получить доступ к информации. Они пытаются запросить произвольную информацию о любом пациенте (у которого есть uid), но мы должны обеспечить контроль доступа.

Так говорят информация является имя, дата рождения, тип крови и болезни

Доктор А имеет разрешение для всех полей Доктор B может видеть все, кроме крови Администратор может видеть только имя и дата рождения гематолог может видеть только тип крови

ответ

1

для реализации варианта 2, я бы разрешения столбцов таблицы что-то вроде следующего:

CREATE TABLE ColumnPerms 
(
    user_or_role  Varchar(50), 
    table_name  Varchar(50), 
    column_name  Varchar(50), 
) 

CREATE INDEX ix_Columnperms(user_or_role, table_name) 

The * table_name * столбец, чтобы эта функциональность будет реализована больше, чем просто одна таблица в ваше приложение: если это не нужно, не используйте его. Вы могли бы принять соглашение о том, что имена ролей начинаются с символа «@», чтобы убедиться, что столкновение с именами пользователей отсутствует.

Теперь, когда вы строите свой динамический запрос, вы можете сделать что-то вроде

SELECT column_name 
    FROM ColumnPerms 
WHERE user_or_role = '@manager' 
    AND table = 'Payroll' 
    AND column_name IN ('first_name', 'last_name', 'hire_date', 'base_salary', 'bonus') 

(оговорка В должна включать каждый столбец потенциально должен быть возвращен).

Результатом этого запроса является список имен столбцов , которым разрешен просмотр пользователю. Просто перебирайте его, чтобы создать список столбцов при построении динамического SQL.

0

Есть два подхода, которые вы могли бы взять с собой:

  1. использование Postgres для обеспечения безопасности с использованием уровня столбца р ermissions для каждого пользователя (или роли пользователя). Посмотрите на синтаксис для GRANT здесь: http://www.postgresql.org/docs/current/static/sql-grant.html

  2. Построение динамических операторов sql, ограничивающих, какие строки могут быть возвращены для каждого пользователя. Это может стать довольно утомительным, если есть много пользователей или много разных комбинаций столбцов. Вероятно, вы захотите сохранить таблицу идентификаторов пользователей и «выбираемую» таблицу, имена столбцов для построения запроса. Если вы хотите, обобщается множество различных запросов, вы можете либо создать их на вершине возвращающой таблицы функции, которая делает фильтрацию столбцов, или вернуться к варианту 1.

Для варианта 1, убедитесь, что столбцы используется в соединении выбираются ...

+0

GRANT кажется ориентированным на пользователей БД, в то время как мои «пользователи» являются пользователями приложения. В частности, текущий пользователь моего приложения будет исправлен после того, как я открою соединение с db, и я не думаю, что это хорошая идея создать много коротких замыканий. – user492922

+0

Это уменьшает параметры до номера 2. – Curt

+0

Что касается вашего второго варианта, какова схема «выбираемой» таблицы? Каждая строка состоит из булевых для каждого столбца? Я могу работать со стороны приложения. Является ли мое первоначальное предложение использовать массивы для хранения столбцов и делать чек в приложении плохо продуманным? – user492922

Смежные вопросы