Управление доступом на уровне экземпляра в Apache Shiro

Я нашел действительно гибкий фреймворк безопасности Apache Shiro. Я успешно реализовал аутентификацию и авторизацию с помощью Shiro.

Одной из привлекательных особенностей фреймворка является безопасность на основе экземпляров. Я просто скопировал пример с сайта Shiro.

Следующие разрешения хранятся в базе данных.

printer:query:lp7200
printer:print:epsoncolor

Следующий код проверяет, есть ли у текущего аутентифицированного пользователя разрешение для данного экземпляра принтера.

if ( SecurityUtils.getSubject().isPermitted("printer:query:lp7200") {
 // Return the current jobs on printer lp7200
}

Мой вопрос заключается в том, что «это то, как разрешения хранятся в базе данных?» Есть ли лучший способ хранить разрешения на основе экземпляра?

Пожалуйста, дай мне знать.

Спасибо


person Chir    schedule 19.01.2012    source источник


Ответы (1)


Как вы храните эту информацию, полностью зависит от вас. Ваша реализация Realm отвечает за запросы к любому источнику данных, который вы используете, и извлечение данных разрешений в предпочтительном формате.

Некоторые люди хранят их напрямую в виде строк (например, показанные в вашем примере), другие люди хранят их в специальной таблице (например, при использовании СУБД) (например, столбцы разрешения_типа, цели, действия). Вы можете связать объекты разрешений с ролями или напрямую с пользователями или с группами, которые назначены пользователям и т. д., однако это имеет смысл для вашего приложения.

Ваши варианты хранения полностью зависят от вас. Вы материализуете данные, однако хотите, чтобы операции Realm.isPermitted(...) функционировали должным образом.

Вместо прямой реализации методов Realm.isPermitted(...) многие люди считают более удобным создать подкласс абстрактного класса AuthorizingRealm, переопределить метод doGetAuthorizationInfo и вернуть экземпляры AuthorizationInfo, которые поддерживают представления разрешений.

В этом методе вы можете запросить свое хранилище данных, преобразовать возвращенные данные в AuthorizationInfo экземпляров, и все готово (не забудьте включить кэширование авторизации — вы увидите большой выигрыш в производительности).

Переопределение методов Realm isPermitted необходимо только в том случае, если вы хотите очень специфический контроль над запросами и т. д.

person Les Hazlewood    schedule 20.01.2012