23
Практика
1. Создайте две роли (пароль должен совпадать с именем):
– employee — сотрудник магазина,
– buyer — покупатель.
Убедитесь, что созданные роли могут подключиться к БД.
2. Отзовите у роли public права выполнения всех функций
и подключения к БД.
3. Разграничьте доступ таким образом, чтобы:
– сотрудник мог только заказывать книги, а также
– добавлять авторов и книги,
– покупатель мог только приобретать книги.
Проверьте выполненные настройки в приложении.
1. Сотрудник — внутренний пользователь приложения, аутентификация
выполняется на уровне СУБД.
Покупатель — внешний пользователь. В реальном интернет-магазине
управление такими пользователями ложится на приложение, а все
запросы поступают в СУБД от одной «обобщенной» роли (buyer).
Идентификатор конкретного покупателя может передаваться как
параметр (но в нашем приложении мы этого не делаем).
3. Вообще говоря, разграничение доступа должно быть заложено
и в приложение. В нашем учебном приложении разграничение не
сделано специально: вместо этого на веб-странице можно явно
выбрать роль, от имени которой пойдет запрос в СУБД. Это позволяет
посмотреть, как поведет себя серверная часть при некорректной работе
приложения.
Итак, пользователям нужно выдать:
- Право подключения к БД bookstore и доступ к схеме bookstore.
- Доступ к представлениям, к которым происходит непосредственное
обращение.
- Доступ к функциям, которые вызываются как часть API. Если оставить
функции SECURITY INVOKER, придется выдавать доступ и ко всем
«нижележащим» объектам (таблицам, другим функциям). Однако
удобнее просто объявить API-функции как SECURITY DEFINER.
Разумеется, ролям нужно выдать привилегии только на те объекты,
доступ к которым у них должен быть.