2012-05-15 1 views
1

У меня есть запрос Hibernate, который возвращает мне список отображаемых элементов. Мне нужно проверить, доступен ли текущий пользователь для просмотра каждого из возвращаемых элементов. Я могу сделать это примерно так:Как я могу проверить разрешения Shiro для списка элементов?

for (Element e : elements) { 
    SecurityUtils.getSubject().hasPermission("element:view:" + e.id); 
} 

но этот код будет генерировать x запросов к базе данных на каждый элемент. Таким образом, скорость проверки будет равна O (n).

Как я могу улучшить свое решение? Можно ли получить скорость O (1)?

ответ

2

Существует метод, называемый isPermittedAll(String ...), который будет возвращать true, если Субъект имеет все разрешения.

См: http://shiro.apache.org/static/current/apidocs/org/apache/shiro/subject/Subject.html#isPermittedAll%28java.lang.String...%29

Хотя, если честно, я не знаю, насколько более эффективным является с точки зрения БД запросов (если вообще).

+0

Мне нужно фильтровать элементы. Я думаю, что если у пользователя нет доступа к 1 элементу 'isPermitedAll', он вернет' false' для всех элементов –

0

Учитывая ваш пример, вы, вероятно, хотите сделать следующее:

String[] permissions = new String[elements.size()]; 

for (int i = 0; i < elements.size(); i++) { 
    permissions[i] = "element:view:" + e.id; 
} 

boolean[] allowed = SecurityUtils.getSubject().isPermitted(permissions); 

List<Element> allowedElements = new ArrayList<Element>(); 

for (int i = 0; i < elements.size(); i++) { 
    //1:1 match on entries in allowed to elements 
    if (allowed[i]) { 
     allowedElements.add(elements[i]); 
    } 
} 

//allowedElements now contains the set of elements the user is permitted to access 
return allowedElements; 

Метод Subject API я здесь: boolean[] isPermitted(String... permissions)

Недостатком этого подхода является то, что вы фактически в конечном итоге повторяя ваш список элементов дважды. Однако вы в конечном итоге сохраняете из-за того, что вам не нужно делать вызов базы данных на элемент.

Следует отметить, что время выполнения может меняться в зависимости от того, как реализована ваша безопасность Realm.

 Смежные вопросы

  • Нет связанных вопросов^_^