目录html
1.1 authorizespring
1.2 authenticationexpress
1.3 accesscontrollistsession
Spring Security也有对Jsp标签的支持的标签库。其中一共定义了三个标签:authorize、authentication和accesscontrollist。其中authentication标签是用来表明当前Authentication对象的,咱们能够利用它来展现当前Authentication对象的相关信息。另外两个标签是用于权限控制的,能够利用它们来包裹须要保护的内容,一般是超连接和按钮。dom
若是须要使用Spring Security的标签库,那么首先咱们应当将对应的jar包spring-security-taglibs-xxx.jar放入WEB-INF/lib下;其次咱们须要在页面上引入Spring Security的标签库。jsp
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>lua
接下来就能够在页面上自由的使用Spring Security的标签库提供的标签了。url
authorize是用来判断普通权限的,经过判断用户是否具备对应的权限而控制其所包含内容的显示,其能够指定以下属性。htm
一、access对象
access属性须要使用表达式来判断权限,当表达式的返回结果为true时表示拥有对应的权限。
<sec:authorize access="hasRole('admin')">
<a href="admin.jsp">admin page</a>
</sec:authorize>
须要注意的是由于access属性是使用表达式的,因此咱们必须确保ApplicationContext中存在一个WebSecurityExpressionHandler,最简单的办法就是直接使用NameSpace,经过设置http元素的use-expressions="true"让NameSpace自动为咱们建立一个WebSecurityExpressionHandler。
二、ifAllGranted、ifAnyGranted和ifNotGranted
这三个属性的用法相似,它们都接收以逗号分隔的权限列表,且不能使用表达式。ifAllGranted表示须要包含全部的权限,ifAnyGranted表示只须要包含其中的任意一个便可,ifNotGranted表示不能包含指定的任意一个权限。
<!-- 须要拥有全部的权限 -->
<sec:authorize ifAllGranted="ROLE_ADMIN">
<a href="admin.jsp">admin</a>
</sec:authorize>
<!-- 只需拥有其中任意一个权限 -->
<sec:authorize ifAnyGranted="ROLE_USER,ROLE_ADMIN">hello</sec:authorize>
<!-- 不容许拥有指定的任意权限 -->
<sec:authorize ifNotGranted="ROLE_ADMIN">
<a href="user.jsp">user</a>
</sec:authorize>
三、url
url表示若是用户拥有访问指定url的权限即表示能够显示authorize标签包含的内容。
<!-- 拥有访问指定url的权限才显示其中包含的内容 -->
<sec:authorize url="/admin.jsp">
<a href="admin.jsp">admin</a>
</sec:authorize>
四、method
method属性是配合url属性一块儿使用的,表示用户应当具备指定url指定method访问的权限,method的默认值为GET,可选值为http请求的7种方法。
<!-- 拥有访问指定url的权限才显示其中包含的内容 -->
<sec:authorize url="/admin.jsp">
<a href="admin.jsp">admin</a>
</sec:authorize>
限制访问方法是经过http元素下的intercept-url元素的method属性来指定的,如:
<security:intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" method="POST"/>
五、var
用于指定将权限鉴定的结果存放在pageContext的哪一个属性中。该属性的主要做用是对于在同一页面的多个地方具备相同权限鉴定时,咱们只须要定义一次,而后将鉴定结果以var指定的属性名存放在pageContext中,其它地方能够直接使用以前的鉴定结果。
<sec:authorize access="isFullyAuthenticated()" var="isFullyAuthenticated">
只有经过登陆界面进行登陆的用户才能看到1。<br/>
</sec:authorize>
上述权限的鉴定结果是:${isFullyAuthenticated }<br/>
<%if((Boolean)pageContext.getAttribute("isFullyAuthenticated")) {%>
只有经过登陆界面进行登陆的用户才能看到2。
<%}%>
各属性对应的优先级
既然咱们能够经过属性access、url、ifAllGranted、ifAnyGranted等来指定应当具备的权限,那么当同时指定多个属性时,它们的做用效果是什么样的呢?authorize标签进行权限鉴定的属性根据优先级的不一样能够分为三类,access为一类;url为一类;ifAllGranted、ifAnyGranted和ifNotGranted为一类。这三类将同时只有一类产生效果。它们的优先级以下:
一、access具备最高的优先级,若是指定了access属性,那么将以access属性指定的表达式来鉴定当前用户是否有权限。无论结果如何,此时其它属性都将被忽略。
二、若是没有指定access属性,那么url属性将具备最高优先级,此时将直接经过url属性和method属性(默认为GET)来鉴定当前用户是否有权限。无论结果如何,此时都将忽略ifAllGranted、ifAnyGranted和ifNotGranted属性。
三、若是access和url都没有指定,那么将使用第三类属性来鉴定当前用户的权限。当第三类里面同时指定了多个属性时,它们将都发生效果,即必须指定的三类权限都知足才认为是有对应的权限。如ifAllGranted要求有ROLE_USER的权限,同时ifNotGranted要求不能有ROLE_ADMIN的权限,则结果是它们的并集,即只有拥有ROLE_USER权限,同时不拥有ROLE_ADMIN权限的用户才被容许获取指定的内容。
authentication标签用来表明当前Authentication对象,主要用于获取当前Authentication的相关信息。authentication标签的主要属性是property属性,咱们能够经过它来获取当前Authentication对象的相关信息。如一般咱们的Authentication对象中存放的principle是一个UserDetails对象,因此咱们能够经过以下的方式来获取当前用户的用户名。
<sec:authentication property="principal.username"/>
固然,咱们也能够直接经过Authentication的name属性来获取其用户名。
<sec:authentication property="name"/>
property属性只容许指定Authentication所拥有的属性,能够进行属性的级联获取,如“principle.username”,不容许直接经过方法进行调用。
除了property属性以外,authentication还能够指定的属性有:var、scope和htmlScape。
var属性
var属性用于指定一个属性名,这样当获取到了authentication的相关信息后会将其以var指定的属性名进行存放,默认是存放在pageConext中。能够经过scope属性进行指定。此外,当指定了var属性后,authentication标签不会将获取到的信息在页面上进行展现,如需展现用户应该经过var指定的属性进行展现,或去掉var属性。
<!-- 将获取到的用户名以属性名username存放在session中 -->
<sec:authentication property="principal.username" scope="session" var="username"/>
${username }
scope属性
与var属性一块儿使用,用于指定存放获取的结果的属性名的做用范围,默认我pageContext。Jsp中拥有的做用范围都进行进行指定。
htmlScape属性
表示是否须要将html进行转义。默认为true。
accesscontrollist标签是用于鉴定ACL权限的。其一共定义了三个属性:hasPermission、domainObject和var,其中前两个是必须指定的。hasPermission属性用于指定以逗号分隔的权限列表;domainObject用于指定对应的域对象;而var则是用以将鉴定的结果以指定的属性名存入pageContext中,以供同一页面的其它地方使用。须要注意的是使用accesscontrollist标签时ApplicationContext中必须存在一个PermissionEvaluator bean,由于accesscontrollist标签就是经过PermissionEvaluator来鉴定对应的权限的。若是咱们正在使用Spring Security的ACL模块,那么PermissionEvaluator一般就对应着AclPermissionEvaluator。此外,若是domainObject属性指定的domainObject为null则默认认为是有权限的,不然若是当前Authentication对象为null则默认认为是没有权限的。
<sec:accesscontrollist hasPermission="1,2" domainObject="${someTargetDomainObject }" >
若是当前Authentication对指定的domainObject拥有指定的hasPermission则将能够看到这部份内容。
</sec:accesscontrollist>
(注:本文是基于Spring Security3.1.6所写)