【问题标题】:Spring Security switch case in JSTL TagsJSTL 标签中的 Spring Security 开关案例
【发布时间】:2014-12-25 03:24:52
【问题描述】:

有没有办法转换一个jsp代码的形式

<security:authorize access="hasRole('ROLE_USER')">You're an user</security:authorize>
<security:authorize access="hasRole('ROLE_ADMIN')">You're an admin</security:authorize>
<security:authorize access="hasRole('ROLE_SADMIN')">You're a superadmin</security:authorize>

到另一种形式,类似于以下(不起作用)?

<c:choose>
  <c:when test="hasRole('ROLE_USER')">
    You're an user
  </c:when>
  <c:when test="hasRole('ROLE_ADMIN')">
    You're an admin
  </c:when>
  <c:when test="hasRole('ROLE_SADMIN')">
    You're a superadmin
  </c:when>
  <c:otherwise>
    You have no relevant role
  </c:otherwise>
</c:choose>

更准确地说,有没有办法用 JSTL 标签替换这个 Spring Security taglib 功能?

【问题讨论】:

  • 您可以通过创建与 Spring 标签执行相同操作的自定义标签来做到这一点。但你只会重新发明轮子。
  • 当我没记错的时候,重新发明轮子是我一年前找到的解决这个问题的唯一方法。

标签: java spring jsp spring-security taglib


【解决方案1】:

您可以使用&lt;security:authorize/&gt; 标签的var 属性创建:

一个页面范围的变量,其中标记的布尔结果 将写入评估,允许重复使用相同的条件 随后在页面中没有重新评估。

<security:authorize access="hasRole('ROLE_USER')" var="isUser" />
<security:authorize access="hasRole('ROLE_ADMIN')" var="isAdmin" />
<security:authorize access="hasRole('ROLE_SADMIN')" var="isSuperUser" />

<c:choose>
  <c:when test="${isSuperUser}">
    You're a superadmin
  </c:when>
  <c:when test="${isAdmin}">
    You're an admin
  </c:when>
  <c:when test="${isUser}">
    You're an user
  </c:when>
  <c:otherwise>
    You have no relevant role
  </c:otherwise>
</c:choose>

【讨论】:

    【解决方案2】:

    Workarround:当您只有这个简单的hasRole(XXX) 表达式时,您可以拥有一个包含当前用户角色的变量。这个变量可以由控制器填充,或者当您在几乎所有 jsps 中需要它时,由 Spring HandlerInterceptor 或 Servlet 过滤器(在 Spring 安全过滤器之后注册)填充。

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 2013-07-13
      相关资源
      最近更新 更多