You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Spring Security标签与JSTL实现侧边栏设置图标多权限跳转逻辑

我来帮你修正这段代码,你的问题主要是逻辑判断搞反了,而且没区分不同权限对应的跳转地址。咱们一步步来解决:

首先,先明确你的核心需求:

  • 只有当用户拥有ROLE_MANAGE_SYSTEM_USER或ROLE_MANAGE_USER_ROLE任一权限时,才显示侧边栏设置图标
  • 若用户同时拥有两个权限,或仅拥有ROLE_MANAGE_SYSTEM_USER,点击图标跳转到/setting/systemUser/load
  • 若用户仅拥有ROLE_MANAGE_USER_ROLE,点击跳转到/setting/systemRole/load

你原来的代码错误在于:把「无权限时显示跳转链接」的逻辑写进了<c:otherwise>,而且没有区分不同权限对应的跳转地址。下面是两种可行的修正方案:

方案一:用JSTL <c:choose> 嵌套Spring Security标签

这种方案逻辑更紧凑,外层先过滤有权限的用户,内部再区分跳转地址:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!-- 先判断用户是否有任一权限,只有满足才渲染图标 -->
<sec:authorize access="hasAnyRole('ROLE_MANAGE_SYSTEM_USER', 'ROLE_MANAGE_USER_ROLE')">
    <c:choose>
        <!-- 拥有SYSTEM_USER权限(包括同时拥有两个权限的情况) -->
        <c:when test="${sec:hasRole('ROLE_MANAGE_SYSTEM_USER')}">
            <a href="<c:url value="/setting/systemUser/load"/>">
                <p><i class="icon ion-settings"></i></p>Settings
            </a>
        </c:when>
        <!-- 仅拥有USER_ROLE权限(外层已过滤必须有任一权限,所以这里必然是只有该权限) -->
        <c:otherwise>
            <a href="<c:url value="/setting/systemRole/load"/>">
                <p><i class="icon ion-settings"></i></p>Settings
            </a>
        </c:otherwise>
    </c:choose>
</sec:authorize>

方案二:用多个独立的Spring Security标签判断

这种方案逻辑更直观,不需要嵌套,直接针对每种权限组合单独渲染:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!-- 拥有SYSTEM_USER权限(含同时拥有两个权限)时显示的链接 -->
<sec:authorize access="hasRole('ROLE_MANAGE_SYSTEM_USER')">
    <a href="<c:url value="/setting/systemUser/load"/>">
        <p><i class="icon ion-settings"></i></p>Settings
    </a>
</sec:authorize>

<!-- 仅拥有USER_ROLE权限时显示的链接(用!hasRole排除有SYSTEM_USER权限的情况) -->
<sec:authorize access="hasRole('ROLE_MANAGE_USER_ROLE') and !hasRole('ROLE_MANAGE_SYSTEM_USER')">
    <a href="<c:url value="/setting/systemRole/load"/>">
        <p><i class="icon ion-settings"></i></p>Settings
    </a>
</sec:authorize>

注意事项

  • 确保JSP页面顶部已经正确引入Spring Security和JSTL标签库(就是上面代码开头的两行<%@ taglib %>)
  • Spring Security标签的hasRole方法会自动处理权限前缀(如果你配置了前缀的话),如果你的权限没有前缀,也可以用hasAuthority替代hasRole

内容的提问来源于stack exchange,提问作者GeekySelene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:40:55