Предоставление привилегий
Представления при контроле доступа
Хотя доступом нельзя управлять на уровне отдельных полей или записей, желаемого результата можно добиться при помощи представления. Если создать для таблицы представление и ограничить работу с таблицей этим представлением, можно добиться того, что в выборку будут включаться только заданные поля или записи.
Чтобы ограничить доступ к полям, перечислите их в списке полей команды SELECT при создании представления. В результате представление будет возвращать только те поля, которые были указаны вами. Ограничение доступа к записям осуществляется включением секции WHERE в команду SELECT, после чего представление будет состоять из записей, удовлетворяющих условию в секции WHERE (за дополнительной информацией о создании представлений обращайтесь к главе 4).
Поскольку привилегии доступа назначаются не только таблицам, но и представлениям, вы можете предоставить право SELECT для ограниченного представления, но не для всей таблицы. Пользователи смогут получать данные из представления, не располагая доступом к таблице, на основе которой строится это представление.
Допустим, в базе данных booktown имеется таблица stock, в которой код ISBN книги связывается с закупочной ценой, розничной ценой продажи и количеством экземпляров на складе. Структуру таблицы иллюстрирует табл. 10.3.
Таблица 10.3. Таблица stock.
Поле | Тип | Модификатор |
---|---|---|
isbn | text | NOT NULL |
cost | numeric (5. 2) | |
retail | numeric (5. 2) | |
stock | integer |
Допустим, вы не хотите, чтобы работники из отдела продаж знали закупочную цену книг. Чтобы ограничить доступ к этой информации, создайте представление, в которое входят данные из полей isbn, retail и stock. В листинге 10.20 мы создаем представление, даем право доступа к нему группе sales и затем проверяем результат командой \z в клиенте psql.
Листинг 10.20. Управление привилегией SELECT с использованием представления.
booktown=# CREATE VIEW stock_view booktown-# AS SELECT isbn, retail, stock booktown-# FROM stock; CREATE booktown=# GRANT SELECT ON stockjhew TO GROUP sales; CHANGE booktown=# \z stock Access permissions for database "booktown" Relation | Access permissions stock | stock_backup j stock_view | {"=","manager=arwR"."group sales=r"} (3 rows)
В листинге 10.21 создается новый пользователь barbara, которому предоставляется право SELECT для представления stock_view. Поскольку пользователь barbara изначально не обладает никакими правами доступа к таблице stock, таблица будет недоступна; ситуация не изменяется даже после получения доступа к представлению в результате выполнения команды GRANT.
Листинг 10.21. Управление привилегией SELECT.
booktown=# CREATE USER barbara; CREATE USER booktown=# GRANT USER barbara SELECT ON stock_view; booktown=# \c – barbara You are now connected as new user barbara. booktown › SELECT * FROM stock; ERROR: stock: Permission denied. booktown › SELECT * FROM stock_view; Isbn retail stock 0385121679 36.95 65 039480001X 32.95 31 0394900014 23.95 0 044100590X 45.95 89 0441172717 21.95 77 0451160916 28.95 22 0451198492 46.95 0 0451457994 22.95 0 0590445065 23.95 10 0679803335 24.95 18 0694003611 28.95 50 0760720002 23.95 28 0823015505 28.95 16 0929605942 21.95 25 1885418035 24.95 77 0394800753 16.95 4 (16 rows)
При подключении под именем barbara команда SELECT для представления stock_v1ew выполняется успешно, а выборка из таблицы stock приводит к ошибке Permission denied.