Доступ на уровне страницы Широ
Я довольно новичок в 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>