Chapter 19. JSP标签库
Spring Security有它自己的Taglib,提供了JSP中访问权限信息和提供安全约束的功能。
要想使用这些标签,你必须在你的JSP中声明安全taglib:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
这个标签用来决定它的内容是否会被执行。在Spring Security 3.0中, 它可以被用在两种方式中[13]。第一个方式是使用 web-security表达式, 指定标签中的access
属性。 表达式执行会被WebSecurityExpressionHandlder
代理, 这个类定义在application context中(你应该在<http>
命名空间配置中 启用了web表达式,并确认这个服务可以使用)。所以,比如,你可能使用
<sec:authorize access="hasRole('supervisor')"> 这段内容只能被拥有在他们的<tt>GrantedAuthority</tt>列表中 含有"supervisor"权限的用户才能看到。 </sec:authorize>
一个常见的需求是指显示一个特定的链接,如果用户允许点击它。 怎么让我们进一步决定是否一些事情可以允许呢? 标签也可以用一种可选的模式操作,允许你定义一个特定的URL作为属性。 如果用户允许调用这个URL,标签内容就会被执行, 否则它会被略过。所以,你可能会使用一些像
<sec:authorize url="/admin"> 这些内容之会被有权限发送请求到"/admin" URL的用户才可以看到。 </sec:authorize>
为了使用这个标签,必须在你的application context中拥有一个 WebInvocationPrivilegeEvaluator
实例。 如果你使用了命名空间,会自动注册一个。这是一个 DefaultWebInvocationPrivilegeEvaluator
的实例, 它会创建一个默认web请求对提供的URL,调用安全拦截器来查看请求是成功还是失败的。 这允许你代理到访问控制设置,你使用intercept-url
声明在 <http>
命名空间中的配置,保存信息(比如必须的角色)在你的JSP中。 这种方式也可以结合method
属性,提供HTTP method, 为了更详细的匹配。
这个标签允许访问当前的Authentication
对象, 保存在安全上下文中。它直接渲染一个对象的属性在JSP中。 所以,比如,如果Authentication
的 principal
属性是Spring Security的 UserDetails
对象的一个实例,就要使用 <sec:authentication property="principal.username" />
来渲染当前用户的名称。
当然,它不必使用JSP标签来实现这些功能,一些人更愿意在视图中保持逻辑越少越好。 你可以在你的MVC控制器中访问Authentication
对象 (通过调用SecurityContextHolder.getContext().getAuthentication()
) 然后直接在模型中添加数据,来渲染视图。
这个标签纸在使用Spring Security ACL模块时才可以使用。它检测一个用逗号分隔的 特定领域对象的需要权限列表。如果当前用户拥有这些权限的任何一个,标签内容就会被执行。 否则,就会被略过。一个例子可能像
<sec:accesscontrollist hasPermission="1,2" domainObject="someObject"> 这些将被显示,如果用户拥有指定对象的权限显示为"1"或"2"。 </sec:accesscontrollist>
权限会被传递到PermissionFactory
定义在application context中,把它们转换为ACL的 Permission
实例,所以他们可以使用 工厂支持的任何格式 - 不是必须使用整数,它们可以是字符串,像 READ
或者 WRITE
。 如果没有找到PermissionFactory
, 一个DefaultPermissionFactory
实例会被使用。 application context中的AclService
会被用来加载 对应的对象的Acl
实例。 Acl
会被调用,使用需要的权限来检测, 如果它们中的任何一个被授权了。