第 15 章 标签库

Spring Security提供的标签库,主要的用途是为了在视图层直接访问用户信息,再者就是为了对显示的内容进行权限管理。

15.1. 配置taglib

如果需要使用taglib,首先要把spring-security-taglibs-2.0.5.RELEASE.jar放到项目的classpath下,这在文档附带的实例中已经配置好了依赖。剩下 的只要在jsp上添加taglib的定义就可以使用标签库了。

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
        

15.2. authenticaiton

authentication的功能是从SecurityContext中获得一些权限相关的信息。

可以用它获得当前登陆的用户名:

<sec:authentication property="name"/>
        

获得当前用户所有的权限,把权限列表放到authorities变量里,然后循环输出权限信息:

<sec:authentication property="authorities" var="authorities" scope="page"/>
<c:forEach items="${authorities}" var="authority">
  ${authority.authority}
</c:forEach>
        

15.3. authorize

authorize用来判断当前用户的权限,然后根据指定的条件判断是否显示内部的内容。

<sec:authorize ifAllGranted="ROLE_ADMIN,ROLE_USER">1
  admin and user
</sec:authorize>

<sec:authorize ifAnyGranted="ROLE_ADMIN,ROLE_USER">2
  admin or user
</sec:authorize>

<sec:authorize ifNotGranted="ROLE_ADMIN">3
  not admin
</sec:authorize>
        

1

ifAllGranted,只有当前用户同时拥有ROLE_ADMIN和ROLE_USER两个权限时,才能显示标签内部内容。

2

ifAnyGranted,如果当前用户拥有ROLE_ADMIN或ROLE_USER其中一个权限时,就能显示标签内部内容。

3

ifNotGranted,如果当前用户没有ROLE_ADMIN时,才能显示标签内部内容。

15.4. acl/accesscontrollist

用于判断当前用户是否拥有指定的acl权限。

<sec:accesscontrollist domainObject="${item}" hasPermission="8,16">
      |
      <a href="message.do?action=remove&id=${item.id}">Remove</a>
</sec:accesscontrollist>
        

我们将当前显示的对象作为参数传入acl标签,然后指定判断的权限为8(删除)和16(管理),当前用户如果拥有对这个对象的删除和管理权限时,就会显示对应的remove超链接,用户才可以通过此链接对这条记录进行删除操作。

关于ACL的知识,请参考第 53 章 ACL基本操作

15.5. 为不同用户显示各自的登陆成功页面

一个常见的需求是,普通用户登录之后显示普通用户的工作台,管理员登陆之后显示后台管理页面。这个功能可以使用taglib解决。

其实只要在登录成功后的jsp页面中使用taglib判断当前用户拥有的权限进行跳转就可以。

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<sec:authorize ifAllGranted="ROLE_ADMIN">1
  <%response.sendRedirect("admin.jsp");%>
</sec:authorize>
<sec:authorize ifNotGranted="ROLE_ADMIN">2
  <%response.sendRedirect("user.jsp");%>
</sec:authorize>
        

1

当用户拥有ROLE_ADMIN权限时,既跳转到admin.jsp显示管理后台。

2

当用户没有ROLE_ADMIN权限时,既跳转到user.jsp显示普通用户工作台。

这里我们只做最简单的判断,只区分当前用户是否为管理员。可以根据实际情况做更加复杂的跳转,当用户具有不同权限时,跳到对应的页面,甚至可以根据用户username跳转到各自的页面。

实例在ch105。