Доступ на уровне страницы Широ

Я довольно новичок в Apache Shiro, но, надеюсь, это простой вопрос. Я потратил немало времени на поиск ответа, но не могу его найти.

У меня есть страница администратора в виде JSP, на которой я хочу отображать различные ссылки в зависимости от прав пользователя. Например:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

<shiro:hasPermission name="admin:user:update">
   <li class="admin-link update-user">Update Users</li>
</shiro:hasPermission>
<shiro:hasPermission name="admin:role:update">
   <li class="admin-link update-role">Update Roles</li>
</shiro:hasPermission>

Это хорошо работает. Однако, если у пользователя нет прав доступа к ссылкам на этой странице, я бы хотел отобразить сообщение. Мне все равно, на какие ссылки они имеют права, любая ссылка остановит отображение сообщения.

Я думал о выполнении:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<shiro:hasPermission name="admin">
   <shiro:hasPermission name="admin:user:update">
      <li class="admin-link update-user">Update Users</li>
   </shiro:hasPermission>
   <shiro:hasPermission name="admin:role:update">
      <li class="admin-link update-role">Update Roles</li>
   </shiro:hasPermission>
</shiro:hasPermission>
<shiro:lacksPermission name="admin">
    Sorry, you do not have admin rights
</shiro:lacksPermission>

Однако я использую групповые разрешения, поэтому наличие определенного разрешения, например "admin: role: update", не подразумевает универсального разрешения, такого как "admin", поэтому всегда отображается сообщение "У вас нет прав администратора".

(То есть:new WildcardPermission("admin").implies(new WildcardPermission("admin:user:update") это правда, но new WildcardPermission("admin:user:update").implies(new WildcardPermission("admin") ложно)

Есть ли простой способ сделать это, или мне нужно определить новое разрешение с "правами страницы администратора" и убедиться, что для любых ролей, которые получают права на использование любых ссылок, также требуется это новое разрешение? (Что звучит как техническое обслуживание).

1 ответ

Используйте основной тег lib внутри тегов shiro, таких как

<c:set var="allowed"  value="false"/>

<shiro:hasPermission name="admin">
   <shiro:hasPermission name="admin:user:update">
      <c:set var="allowed"  value="true"/>
      <li class="admin-link update-user">Update Users</li>
   </shiro:hasPermission>
   <shiro:hasPermission name="admin:role:update">
      <c:set var="allowed"  value="true"/>
      <li class="admin-link update-role">Update Roles</li>
   </shiro:hasPermission>
</shiro:hasPermission>
<c:if test="${not allowed}" >
    Sorry, you do not have admin rights
</c:if>
Другие вопросы по тегам