《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)
实现授权精确控制的方法
?
在开发精确控制授权的web应用时,这两种方法都能很好的实现功能。让我们通过JBCP Pets用例来介绍没种方法的实现。
?
我们希望使用安全规划的结果来保证在网站范围内的菜单栏上“退出”和“我的订单”链接只能对登录过的或已购买的用户(分别为ROLE_USER和ROLE_CUSTOMER)显示。我们还会保证“登录”链接只对浏览站点的未认证访客(不具备ROLE_USER的用户)可见。我们将会介绍这两种添加该功能的方式,首先从Spring Security的JSP标签库开始。
我们在第三章中见到过,可以使用SpringSecurity的标签库访问存在于Authentication对象中的数据,这里我们将会见识到标签库的一些其它强大功能。Spring Security标签库最常用的功能就是基于授权规则有条件地渲染页面的各部分。这是通过<authorize>标签来实现的,它与JSTL核心库的<if>标签类似,在标签体中的内容是否显示由标签属性的条件结果来确定。让我们使用<authorize>标签按条件显示页面的部分。
基于URL访问规则进行有条件渲染Spring Security的标签库提供了按照已有的URL授权规则进行内容渲染的功能,而URL授权规则已经在应用安全的配置文件中进行了定义。这是通过使用<authorize>标签的<url>属性来达到的。
例如,我们要保证“My Account”链接只能对实际登录站点的用户显示——回忆一下我们在前面定义的如下访问规则:
?
- 对于很多场景来说,使用<authorize>标签能够保证只有用户允许看见的前提下,正确地渲染链接或action相关的内容。需要记住的是,这个标签不仅能够包在一个链接外面,如果用户没有权限提交这个form的时候,它还能包在整个form外边。
?
基于Spring 表达式语言进行有条件渲染?
另外,可以联合使用<authorize>标签和Spring表达式语言(SpEL)更灵活地显示JSP内容。
回忆一下在第二章中我们初次体验SpEL提供的强大表达式语言,SpringSecurity对其进行了更强的扩展,从而能够对当前安全的请求构建表达式。如果我们对前面的例子使用SpEL进行重构的话,在<authorize>标签中限制访问“My Account”链接的代码应该如下:
?
- “Log In”链接应该只能对匿名的用户显示,也就是没有ROLE_USER角色的用户。<authorize>标签通过ifNotGranted属性支持这种类型的规则:
?
- 以上的三种页面授权方法((ifNotGranted,ifAnyGranted,ifAllGranted)支持JSP EL表达式,它将会执行并返回授权的GrantedAuthority(角色等)。如果授权要求的列表会根据页面计算结果而变化的话,这将会提供一定的灵活性。
?