Spring Security提供的标签库,主要的用途是为了在视图层直接访问用户信息,再者就是为了对显示的内容进行权限管理。
如果需要使用taglib,首先要把spring-security-taglibs-2.0.4.jar放到项目的classpath下,这在文档附带的实例中已经配置好了依赖。剩下 的只要在jsp上添加taglib的定义就可以使用标签库了。
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
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>
authorize用来判断当前用户的权限,然后根据指定的条件判断是否显示内部的内容。
<sec:authorize ifAllGranted="ROLE_ADMIN,ROLE_USER"> admin and user </sec:authorize> <sec:authorize ifAnyGranted="ROLE_ADMIN,ROLE_USER"> admin or user </sec:authorize> <sec:authorize ifNotGranted="ROLE_ADMIN"> not admin </sec:authorize>
用于判断当前用户是否拥有指定的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的知识,请参考???。
一个常见的需求是,普通用户登录之后显示普通用户的工作台,管理员登陆之后显示后台管理页面。这个功能可以使用taglib解决。
其实只要在登录成功后的jsp页面中使用taglib判断当前用户拥有的权限进行跳转就可以。
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <sec:authorize ifAllGranted="ROLE_ADMIN"> <%response.sendRedirect("admin.jsp");%> </sec:authorize> <sec:authorize ifNotGranted="ROLE_ADMIN"> <%response.sendRedirect("user.jsp");%> </sec:authorize>
这里我们只做最简单的判断,只区分当前用户是否为管理员。可以根据实际情况做更加复杂的跳转,当用户具有不同权限时,跳到对应的页面,甚至可以根据用户username跳转到各自的页面。
实例在ch105。