我正在尝试根据角色授权链接。
我的页面:
<c:if test="${pageContext.request.userPrincipal.name==null}">
<li> <a href="<c:url value="/registration"/>"><span class="glyphicon glyphicon-user">Register</span></a> </li>
<li> <a href="<c:url value="/login"/>"><span class="glyphicon glyphicon-lock">Login</span></a> </li>
</c:if>
<c:if test="${pageContext.request.userPrincipal.name!=null}">
<security:authorize access="ROLE_USER">
<li><a href="cart.jsp"><span class="glyphicon glyphicon-shopping-cart">CART</span></a></li>
</security:authorize>
<li><a href="<c:url value="/j_spring_security_logout"></c:url>">logout</a></li>
</c:if>
我遇到以下异常:
with root cause
org.springframework.expression.spel.SpelEvaluationException:
EL1008E:(pos 0): Property or field 'ROLE_USER' cannot be found on object of type
'org.springframework.security.web.access.expression.WebSecurityExpressionRoot' - maybe not public?
答案 0 :(得分:0)
<security:authorize access="ROLE_USER">
<security:authorize access="hasRole('ROLE_USER')">
答案 1 :(得分:0)
您必须使用网络安全表达式,请参阅Spring Security Reference:
30.2授权标记
此标记用于确定是否应评估其内容。在Spring Security 3.0中,它可以以两种方式使用[21]。第一种方法使用在标记的
access
属性中指定的Web安全表达式。表达式评估将委派给应用程序上下文中定义的SecurityExpressionHandler<FilterInvocation>
(您应该在<http>
命名空间配置中启用Web表达式以确保此服务可用)。所以,例如,你可能有<sec:authorize access="hasRole('supervisor')"> This content will only be visible to users who have the "supervisor" authority in their list of <tt>GrantedAuthority</tt>s. </sec:authorize>
ROLE_USER
不是内置的网络安全表达式(请参阅Spring Security Reference),而是使用hasRole('USER')
,请参阅SecurityExpressionRoot#hasRole
:
确定
SecurityExpressionOperations.getAuthentication()
中Authentication.getAuthorities()
是否具有特定权限。这与
SecurityExpressionOperations.hasAuthority(String)
类似,不同之处在于此方法意味着传入的String是一个角色。例如,如果在实现中传递“USER”,则可以将其转换为使用“ROLE_USER”。角色转换的方式可能取决于实施设置。