《Spring Security3》第五章第一部分翻译(重新思考应用功能和安全)
第五章 精确的访问控制
到目前为止,我们已经为JBCP Pets站点添加了用户友好的一些功能,包括自定义的登录页以及修改密码、remember me功能。
在本章中,我们将要学习规划应用安全的技术以及用户/组的划分。其次,我们学习两种实现精确访问控制的实现方式——这会影响应用中页面的授权。然后,我们会了解Spring Security如何通过使用方法注解和AOP的方式来实现业务层安全。最后,我们将会了解通过基于注解的配置实现按照角色过滤集合数据这一比较有趣的功能。
在本章中,我们会学到:
l 规划web应用安全的基本技术和组管理,这会使用到现成的工具和批判思考(critical thinking);
l 基于用户请求的上下文,配置和实验在页面级别进行授权检查以显示内容的不同方式;
l 通过配置和代码注解pre-authorization的方式使得调用应用中关键部分是安全的;
l 几种实现方法级别安全的可选方式,并介绍各种方式的优劣;
l 通过使用方法级别的注解,实现基于Collections和Arrays数据的过滤器。
因为本章涉及到的概念超过了前面的一些孤立技术点,为了扩大站点的范围在源代码上做了一定数量的修改,并将其分成了真正三层的系统。你可能对这些变化感兴趣,但是它们与Spring Security没有直接的关系,所以我们将会忽略这些修改的细节。当你发现本章的源代码总添加了许多的文件,不要被吓倒。
重新思考应用功能和安全
现在,我们要再看一下JBCP Pets应用的授权模型和流程。我们感觉已经得到了一个很安全的应用,但是应用的流程并不特别适合与公开的电子商务站点。我们还需要做很多的事情,因为对应用中每个页面(除去登录界面)的请求,都需要用户有一个合法的账号并登录——这无助于用户的浏览和购买。
规划应用安全
通常情况下,需要产品管理领域的人员和安全专员联合工程师来评估用户社区和需求的功能。规划过程——如果能够高效执行——使用工作表和图表来彻底分析应用包含的角色和组。我们会花一点时间简单介绍对JBCP Pets的扩展功能来阐明这个过程是如何进行的。在任何项目中对安全规划的思考过程将会对开发过程很有好处——尝试对你应用中的每个页面和业务服务构建安全状况。
规划用户角色
对于JBCP Pets,我们将会使用下边的表格匹配用户分类到角色(Spring Security的GrantedAuthority值)中。它们中有一些是新的角色,用来对用户进行不同的分类。
用户分类 |
描述 |
角色 |
Guest |
不是记住或认证过的用户 |
None (anonymous) |
Consumer / Customer |
用户已经建立的账号,在站点上可能已完成也可能未完成购买交易 |
ROLE_CUSTOMER ROLE_USER |
Customer w/ Completed Purchase |
用户至少在站点上完成了一笔交易 |
ROLE_PURCHASER ROLE_USER |
Administrator |
负责用户账号管理等功能的管理员 |
ROLE_ADMIN ROLE_USER |
Supplier |
产品供货商,允许管理其产品目录 |
ROLE_SUPPLIER ROLE_USER |
使用这些声明的用户分类和角色,我们能够将角色粗略得匹配到站点的功能设计上。有很多方式能够完成这项任务——以下是我们在过去发现很有用的办法:
l 使用Microsoft Visio和韦恩图来标示功能和用户组的重叠交叉(我们在第二章:Spring Security起步中曾经使用过其很有限的功能)。这种技术对小型的应用和粗略的分析能够非常直观。
l 个性化的图表页面,并注明能够访问每个页面的用户分类和角色。尽管不能直接可视化的访问,但这种方式能够非常精确。我们将会在下面的章节阐述一个这样的例子。
l 使用便条和白板或草图板建模。在这种类型的练习中,产品的规划人员在白板上勾画出一些区域来代表不同的用户角色,并在白板的每个区域上添加便签以代表产品功能。
通常来说,使用非数字的方式进行安全的初期规划是很容易的,因为经常见到组内讨论会产生对安全功能的较大修正,而使用非数字的工具很容易进行调整。典型情况下,这种层次的安全规划不会涉及到单个页面的和页面中某些部分的层次,而是应用中的功能“块”(即应用整体上的安全功能规划——译者注)。
规划页面级权限
下一层次的安全规划就是页面级元素的安全。首先,规划整个站点范围的页面特性是很重要的,这能够保证用户在使用可见功能并切换页面时,保证界面的一致性。大多数的站点已经有了整个站点层次的模板功能,最简单的就是jsp:include指令(正如我们在JBCP Pets中使用的),或者更复杂的,如Apache Tiles 2。
页面级别的安全规划通常与站点的用户体验规划结合起来——很多公司使用Microsoft Visio或者Adobe Dreamweaver进行站点的低保真设计,或者使用更复杂的工具如Axure RP。不管使用什么工具,需要保证的是在规划安全相关的功能时要与站点的最初设计功能相融合。你的UI设计师或界面设计师可能会愿意讨论基于用户的角色,那些元素会显示或不显示。理解页面元素的可能选项能够使得好的UI规划人员设计出合理灵活的布局,从而保证不管用户是什么样的权限,页面都能展现得很好。
【使用正确的工作工具。我有一个UI设计师朋友,他为Visio做了很棒的形状集合,这使我产生了很大的兴趣,这些通过http://www.guuui.com/issues/02_07.ph 可以得到。对于熟悉Visio的人来说,这是一种不错的方式来开发精确、低保真的模型,对于这个工具许多人已经很了解。尽管现在没有兼容Visio的开源产品,类似的应用如Dia (http://projects.gnome.org/dia/)或OpenOffice Draw (http://www.openoffice.org/product/draw.html)对大多数的平台都是支持的。】
一个注明了安全信息的Visio图可能会如下所示:
可以看到我们并不需要很多安全相关信息的细节,但是这个图所表达的意思对于查看的每个人(即使不是技术人员)都很容易理解。