【问题标题】:How to authorize a link based on role in Spring Security 4如何在 Spring Security 4 中根据角色授权链接
【发布时间】:2016-11-07 11:38:58
【问题描述】:

我正在尝试根据角色授权链接。

我的页面:

<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?

【问题讨论】:

    标签: java spring spring-security authorization


    【解决方案1】:

    试试这个..而不是&lt;security:authorize access="ROLE_USER"&gt;

    &lt;security:authorize access="hasRole('ROLE_USER')"&gt;

    【讨论】:

      【解决方案2】:

      您必须使用网络安全表达式,请参阅Spring Security Reference

      30.2 授权标签

      此标签用于确定是否应评估其内容。在 Spring Security 3.0 中,它可以以两种方式使用 [21]。第一种方法使用在标记的access 属性中指定的网络安全表达式。表达式评估将委托给应用程序上下文中定义的SecurityExpressionHandler&lt;FilterInvocation&gt;(您应该在&lt;http&gt; 命名空间配置中启用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”。角色转换的方式可能取决于实现设置。

      【讨论】:

        猜你喜欢
        • 2016-07-01
        • 2018-03-21
        • 2020-06-16
        • 2020-07-09
        • 1970-01-01
        • 2015-03-06
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多