2015-06-03 1 views
0

Я делаю меню на два уровня, и я хочу показать некоторые записи, если у пользователя есть определенные разрешения.ИЛИ состояние в Grails Shiro tag

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

Я положу код, чтобы лучше объяснить его. Это может быть примером меню:

Это есть способ, чтобы обернуть <ul> как-то спросить, имеет ли пользователь foo или bar разрешения?

Я использую Grails 2.4.4 и Shiro плагин 1.2.1

UPDATE С РЕШЕНИЕ:

Наконец я создал новый TagLib, который расширяет ShiroTagLib и имеет нужную функцию:

class ShiroTagLib extends org.apache.shiro.grails.ShiroTagLib { 
    /** 
    * This tag only writes its body to the output if the current user 
    * have any of the given permissions provided in a separated comma String. 
    */ 
    def hasAnyPermission = { attrs, body -> 
     def permissions = attrs["permissions"] 
     if (!permissions){ 
      throwTagError("Tag [hasAnyPermission] must have [permissions] attribute") 
      } 
     def permissionsList = permissions.split(',') 
     for (permission in permissionsList) { 
      if (checkPermission([permission: permission], "hasPermission")) { 
       // Output the body text. 
         out << body() 
       return out 
       } 
      } 
     } 
} 

с этим вы можете сделать <shiro:hasAnyPermission permissions="foo,bar">

ответ

2

Есть несколько способов подойти к этому но hasAnyRole тег от Shiro плагин, вероятно, самый простой способ.

<shiro:hasAnyRole in="foo,bar"> 

<ul> 
    <shiro:hasPermission permission="foo"> 
     <li> foo</li> 
    </shiro:hasPermission> 
    <shiro:hasPermission permission="bar"> 
     <li> bar</li> 
    </shiro:hasPermission> 
</ul> 

</shiro:hasAnyRole> 

Вы можете посмотреть на source code для библиотеки тегов для получения дополнительной информации можно.

Update

Основываясь на комментарий при условии, есть еще один вариант, который основан на разрешениях.

<g:set var="hasSomePermission" value="${false}" /> 
<shiro:hasPermission permission="foo"> 
    <g:set var="hasSomePermission" value="${true}" /> 
</shiro:hasPermission> 
<shiro:hasPermission permission="bar"> 
    <g:set var="hasSomePermission" value="${true}" /> 
</shiro:hasPermission> 
... 
<g:if test="${hasSomePermission}"> 
... 
</g:if> 

Плагин Shiro не обеспечивает логическое ИЛИ тег для разрешений, как это делает с ролями, поэтому выше другой подход. Используя эту же идею, вы можете использовать ее собственную библиотеку тегов.

+0

То, как я делаю это прямо сейчас, но мне нужен метод, который будет внимательно смотреть на права пользователя, а не на роль пользователя. Что-то вроде hasAnyPermission (который не существует) –