SpringSecurity提供了三个JSP安全标签用于在视图层提供安全,如下:
(1) <security:accesscontrollist> : 如果当前认证的用户在指定的领域对象中有规定的许可之一,那么这个标签体中的
内容将被Rendered.
(2) <security:authentication> : 访问当前被认证用户的属性。
(3) <security:authorize> : 根据用户拥有的授权,展示标签体中的内容.
使用上述三个标签需要在JPS中声明:
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
1. <security:authentication>
例如: 页面显示当前被认证用户的用户名。
Hello <security:authentication property="principal.username" />!
通过该标签可访问认证用户信息的几个属性:
(1)auhtorites: GrantedAuthority对象的集合,即已授权给当前认证用户的权限;
(2)credentials: 用于校验principal,通常指用户密码;
(3)details: 认证的附件信息,如:IP地址,证书序列号,SessionId;
(4)principal: 用户的principal.
示例:给用户名指定一个变量:
<security:authentication property="principal.username" var="loginId" />
将创建的变量指定在某个区域(request,session)中:
<security:authentication property="principal.username" var="loginId" scope="request" />
2. <security:authorize>
例如:如果用户拥有"ROLE_SPITTER"权限将显示Form:
<security:authorize access="hasRole('ROLE_SPITTER')">
<c:url value="/spittle" var="spittle_url" />
<form:form modelAttribute="spittle" method="POST" action="${spittle_url}/form">
<span id="label"><spring:message code="label.spittle" text="Enter spittle:"/></span>
<form:textarea path="text" rows="2" cols="40" />
<form:errors path="text" />
<br/>
<div style="width:100%;text-align:right;">
<input type="submit" value="Spit it!" class="status-btn round-btn disabled" />
</div>
</form:form>
</security:authorize>
例如:如果用户名为"habuma"将显示超链接:
<security:authorize access="isAuthenticated() and principal.username=='habuma' ">
<a href="/admin">Administration</a>
</security:authorize>
上面个这种配置有Bug,若从浏览器中输入"/admin"也可以访问,解决该问题有两种方法:
(1) 添加<intercept-url>元素
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN') and
hasIpAddress('192.168.1.2')"/>
这种配置解决了上面的问题但需要的配置文件和JSP中都需要配置。
(2) 使用<security:authorize>的url属性
<security:authorize url="/admin/**">
<spring:url value="/admin" var="admin_url" />
<br/><a href="${admin_url} ">Admin</a>
</security:authorize>
推荐使用方法2.
该标签其他属性:
ifAllGranted, ifAnyGranted, ifNotGranted指当前用户是否已经被授于了权限或授予了上面权限,这三个标签
在SpringSecurity中已经不推荐使用,因为通过SpringEL和access属性即可以做到这三个属性相同的事情。