知识点

相关文章

更多

最近更新

更多

《Spring Security 3》 【第五章】 精确的访问控制(1)

2019-03-14 12:59|来源: 开涛

第五章  精确的访问控制

到目前为止,我们已经为JBCP Pets站点添加了用户友好的一些功能,包括自定义的登录页以及修改密码、remember me功能。

在本章中,我们将要学习规划应用安全的技术以及用户/组的划分。其次,我们学习两种实现精确访问控制的实现方式——这会影响应用中页面的授权。然后,我们会了解Spring Security如何通过使用方法注解和AOP的方式来实现业务层安全。最后,我们将会了解通过基于注解的配置实现按照角色过滤集合数据这一比较有趣的功能。


在本章中,我们会学到:

 规划web应用安全的基本技术和组管理,这会使用到现成的工具和批判思考(critical thinking);

 基于用户请求的上下文,配置和实验在页面级别进行授权检查以显示内容的不同方式;

 通过配置和代码注解pre-authorization的方式使得调用应用中关键部分是安全的;

 几种实现方法级别安全的可选方式,并介绍各种方式的优劣;

 通过使用方法级别的注解,实现基于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


使用这些声明的用户分类和角色,我们能够将角色粗略得匹配到站点的功能设计上。有很多方式能够完成这项

任务——以下是我们在过去发现很有用的办法:

 使用Microsoft Visio和韦恩图来标示功能和用户组的重叠交叉(我们在第二章:Spring Security起步中曾经使用过其很有限的功能)。这种技术对小型的应用和粗略的分析能够非常直观。

 个性化的图表页面,并注明能够访问每个页面的用户分类和角色。尽管不能直接可视化的访问,但这种方式能够非常精确。我们将会在下面的章节阐述一个这样的例子。

 使用便条和白板或草图板建模。在这种类型的练习中,产品的规划人员在白板上勾画出一些区域来代表不同的用户角色,并在白板的每个区域上添加便签以代表产品功能。

通常来说,使用非数字的方式进行安全的初期规划是很容易的,因为经常见到组内讨论会产生对安全功能的较大修正,而使用非数字的工具很容易进行调整。典型情况下,这种层次的安全规划不会涉及到单个页面的和页面中某些部分的层次,而是应用中的功能“块”(即应用整体上的安全功能规划——译者注)。


规划页面级权限

下一层次的安全规划就是页面级元素的安全。首先,规划整个站点范围的页面特性是很重要的,这能够保证用户在使用可见功能并切换页面时,保证界面的一致性。大多数的站点已经有了整个站点层次的模板功能,最简单的就是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图可能会如下所示:


可以看到我们并不需要很多安全相关信息的细节,但是这个图所表达的意思对于查看的每个人(即使不是技术人员)都很容易理解。



感谢  iteye  lengyun3566

他的博客地址:http://lengyun3566.iteye.com

他的新浪微博:http://weibo.com/1920428940

本书源代码的地址:http://www.packtpub.com/support?nid=4435


本文链接:领悟书生教程网,转自http://sishuok.com


相关问答

更多
  • 我不知道你的权限是怎么控制的,比如一个新建人员的按钮,你把他新建的权限给删除了,你是怎么控制那个按钮的,security在jsp中有自己的标签,你可以用那个标签来判断用户是否有该权限,给你个例子 AUTH_4010这个是用户的权限,你的新建按钮的权限是什么你填上去就好了
  • 可能是配置文件路径不对 1. 在配置spring到tomcat里面的时候我们需要加一个listener,添加一个listener以后还要告诉tomcat去哪里找spring的applications。xml文件,所以还要添加一个context-param。就是说告诉tomcat去哪里加载spring配置文件 2. 在web.xml中没有引入applicationContext.xml,及其applicationContext-*.xml文件,或者是引入的路径错误 3. GradeController.cla ...
  •   可能是配置文件路径不对 在配置spring到tomcat里面的时候我们需要加一个listener,添加一个listener以后还要告诉tomcat去哪里找spring的applications。xml文件,所以还要添加一个context-param。就是说告诉tomcat去哪里加载spring配置文件 在web.xml中没有引入applicationContext.xml,及其applicationContext-*.xml文件,或者是引入的路径错误 GradeController.class有问题,c ...
  • 我不知道你的权限是怎么控制的,比如一个新建人员的按钮,你把他新建的权限给删除了,你是怎么控制那个按钮的,security在jsp中有自己的标签,你可以用那个标签来判断用户是否有该权限,给你个例子 AUTH_4010这个是用户的权限,你的新建按钮的权限是什么你填上去就好了
  • 这个错误不是你的这个配置引起的,是sceurity的自动化配置找不到认证,你可以把你的security的完整配置贴出来看看
  • spring
  • 通常,最好将问题分解为多个StackOverflow问题,因为您更有可能找到知道单个问题的答案的人。 我们如何避免为认证失败创建会话? 默认情况下,Spring Security会将最后一次未经身份验证的请求保存到会话中,以便在进行身份验证后可以再次自动发出请求。 例如,如果您在浏览器中请求example.com/a/b/c并且未通过身份验证,则它会将example.com/a/b/c保存到HttpSession中,然后让用户进行身份验证。 通过身份验证后,它会自动为您提供example.com/a/b/c ...
  • 据我所知,这正是无国籍人要做的事情。 将create-session参数设置为无状态后,在每次http调用时,甚至不会调用SecurityContextPersistenceFilter (默认情况下),或者即使根据您的配置强制调用它,也不会是任何会话级安全性SecurityContextHolder中的信息。 此无状态模式旨在用于Rest样式体系结构,其中在每个请求上发送身份验证和授权信息。 更好的说,我不认为应该使用无状态会话创建模式,除非您正在开发一个完整的无状态应用程序 我找到了一篇关于这个的好帖子 ...
  • 如果可能的话,它会是这样的: SecurityContext context = SecurityContextHolder.getContext(); Object principal = context.getAuthentication().getPrincipal(); Object credentials = context.getAuthentication().getCredentials(); GrantedAuthority[] authorities = new GrantedAutho ...