如何用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
相关产品推荐
相关产品推荐

