2016-05-25 7 views
0

Учитывая предмет, который имеет следующие разрешения:Как я могу попросить Apache Shiro об объектных идентификаторов

printer:1:manage 
printer:2:manage 
printer:3:admin 
printer:1:print 
printer:4:print 

Я знаю, что могу спросить:

subject.isPermitted('printer:1:manage') 

Но как я задать Shiro такие вопросы as:

  • Для каких идентификаторов принтера у субъекта есть разрешение «управлять»? (Я хочу ответить 1,2)

  • Для каких идентификаторов принтера у субъекта есть разрешение (или любой вид)? (Я хочу получить ответ 1,2,3)

  • Для каких идентификаторов принтера у субъекта есть разрешение на управление или администратор? (Я хочу ответить 1,4)

ответ

1

API Apache Shiro API предоставляет только проверки и утверждения для разрешений или ролей; он не предоставляет какие-либо методы поиска для поиска того, на что у Субъекта есть разрешения, или для поиска того, какие Субъекты имеют разрешение на что-то.

Вы могли бы изучить реализации собственного findPermissions() в вашем AuthorizingRealm что требуется разрешение в запросов и собирает все доступные разрешения для субъекта, где queryPermission.implies(grantedPermission) возвращается true, несколько вдоль этих линий:

protected Collection<Permission> findPermissions(Permission queryPermission, AuthorizationInfo info) { 
    Collection<Permission> foundPermissions; 
    Collection<Permission> perms = getPermissions(info); 

    if (perms != null && !perms.isEmpty()) { 
     foundPermissions = new ArrayList<Permission>(); 
     for (Permission perm : perms) { 
      if (queryPermission.implies(perm)) { 
       foundPermissions.add(perm); 
      } 
     } 
    } 
    else { 
     foundPermissions = Collections.emptyList(); 
    } 

    return foundPermissions; 
} 

Обратите внимание, что это является обратным отношением implies к тому, как AuthorizingRealm.isPermitted() выполняет свою проверку.

Если вы не привержены Apache Shiro, тем не менее, с открытым исходным кодом OACC security framework(раскрытие: Я сопровождающим и соавтор) фактически предлагается эффективные методы симметричная запрос, чтобы найти как права на ресурсы, а также какие ресурсы имеют разрешение на что-то, без необходимости чего-либо реализовать.

+0

спасибо, я внедрил свою собственную функцию для получения связанного идентификатора экземпляра (за пределами сиро). Я также рассмотрю ваши рамки. – epeleg