Jsp 标签
1.1 authorize
1.2 authentication
1.3 accesscontrollist
Spring Security 也有对 Jsp 标签的支持的标签库。其中一共定义了三个标签: authorize 、 authentication 和 accesscontrollist 。其中 authentication 标签是用来代表当前 Authentication 对象的,我们可以利用它来展示当前 Authentication 对象的相关信息。另外两个标签是用于权限控制的,可以利用它们来包裹需要保护的内容,通常是超链接和按钮。
如果需要使用 Spring Security 的标签库,那么首先我们应当将对应的 jar 包 spring-security-taglibs-xxx.jar 放入 WEB-INF/lib 下;其次我们需要在页面上引入 Spring Security 的标签库。
<%@ taglib prefix = "sec" uri = "http://www.springframework.org/security/tags" %>
接下来就可以在页面上自由的使用 Spring Security 的标签库提供的标签了。
authorize 是用来判断普通权限的,通过判断用户是否具有对应的权限而控制其所包含内容的显示,其可以指定如下属性。
1 、 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 。
2 、 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 >
3 、 url
url 表示如果用户拥有访问指定 url 的权限即表示可以显示 authorize 标签包含的内容。
<!-- 拥有访问指定 url 的权限才显示其中包含的内容 -->
< sec:authorize url = "/admin.jsp" >
< a href = "admin.jsp" > admin </ a >
</ sec:authorize >
4 、 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" />
5 、 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 为一类。这三类将同时只有一类产生效果。它们的优先级如下:
1 、 access 具有最高的优先级,如果指定了 access 属性,那么将以 access 属性指定的表达式来鉴定当前用户是否有权限。不管结果如何,此时其它属性都将被忽略。
2 、如果没有指定 access 属性,那么 url 属性将具有最高优先级,此时将直接通过 url 属性和 method 属性(默认为 GET )来鉴定当前用户是否有权限。不管结果如何,此时都将忽略 ifAllGranted 、 ifAnyGranted 和 ifNotGranted 属性。
3 、如果 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 所写)