2016-09-14 4 views
0

У нас есть приложение, которое позволяет пользователям просматривать список документов.Рекомендации по использованию Shiro для ограничения результатов

В зависимости от роли пользователя и свойств документа мы хотим отфильтровать некоторые из документов в списке. Например, мы хотим разрешить пользователю просматривать список только с документами, которые он создал, а для остальных - серой.

В настоящий момент приложение выполняет команду SQL SELECT, которая возвращает список записей, которые пользователь может и не может видеть. Мы хотим впоследствии ограничить этот набор результатов в соответствии с разрешениями и ролями пользователя. Наши вопросы таковы:

  • Можно ли это сделать через Сиро?
  • Каков правильный способ установки таких ограничений при использовании Сиро? например следует ли ограничивать список с самого начала, используя инструкцию SELECT?

ответ

0

У вас есть несколько вариантов: Во-первых, так как это звучит, как вы хотите, чтобы отобразить полный список документов пользователю вы все равно должны запросить все из них. (хотя я предупреждаю вас об этом, так как это утечка информации, у пользователя также нет доступа. Например, пользовательский jcoder видит документ под названием «Супер секретные пароли», он знает, что у вас есть этот документ. Это может быть или не иметь значения для случаев использования)

Если случай использования тОЛЬКО «только авторы могут редактировать свои собственные документы», то вы могли бы просто простое сравнение имени пользователя (который я предполагаю, что вы делаете сейчас)

Большинство вариантов использования Это не так просто и требует от автора, а также администраторов, техников и т. Д. Доступа к ресурсу. Таким образом, вы можете назначить набор разрешений для ресурса. Мы можем назвать это publications:docs:<document_id>:<action> или просто docs:<document_id>:<action>. Где document_id - это уникальный идентификатор документа, а action - то, что делается с ресурсом (в типичном приложении CRUD они будут создавать, читать, обновлять, удалять). Права на данные могут быть предоставлены любому пользователю, и пользователю может быть предоставлен файл publications:docs:<document_id>:*. Это также позволяет отменять разрешения, если кто-то меняет позицию или документ должен быть помечен как только для чтения, все пользователи, кроме администраторов.

Фрагмент кода будет выглядеть примерно так:

if(SecurityUtils.getSubject().isPermitted("publications:docs:":"+ documentId + ":read") { 
    // do something 
} 

Или вы можете проверить их их all at once.

Ваше приложение должно будет отслеживать добавление разрешений пользователям.

Взгляните: http://shiro.apache.org/permissions.html

И аналогичный вопрос: Java – efficient, database-aware instance-level authorization?