Контроль доступа на уровне экземпляра в Apache Shiro - PullRequest
7 голосов
/ 19 января 2012

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

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

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

printer:query:lp7200
printer:print:epsoncolor

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

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

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

Спасибо

1 Ответ

10 голосов
/ 20 января 2012

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

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

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

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

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

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

...