没有合适的资源?快使用搜索试试~ 我知道了~
ACEGI,用于spring的权限控制框架
资源详情
资源评论
资源推荐
Part I. 架构概览
象其他的软件一样, 也有在整个框架中都会使用的特定核心
接口,类,和概念抽象。在手册的这一部分,在检视这些规划和执行
集成所必须的核心要素之前,我们先介绍 。
第一章. 简介
1.1. Acegi Security 是什么?
为基于 的企业软件应用提供全面的安全服务。特别是使用
领先的 解决方案- 框架开发的项目。如果您不是使用 开
发企业应用,我们温馨提醒您仔细研究一下。熟悉 ,尤其是依赖注射原
理,会极大的帮助你快速掌握 。
人们使用 有很多种原因,不过通常吸引他们到这个项目的原因
是他们在 的 或者 中找不到迫
切需要的典型企业应用场景。提到这些规范,特别要提出的是他们不是在
或者 级别可移植的。这样,如果你切换服务器环境,一般来说你要在目标
环境中花费很多工夫来重新配置你的应用安全。使用 解决了这
些问题,并且为你提供了很多其他有用的,完全可定制的安全特性。
如你所知,安全包含两个主要操作。第一个被称为“认证”,是为用户建立一个它所声明
的 。 通常代表用户,设备,或者其他能在你的应用中执行
操作的其他系统。“授权”指判定一个 能否在你的系统中执行某个操作。
在到达授权判断之前, 的的身份认证已经由认证过程执行过了。这些
概念是通用的,不是 特有的。
在认证层面, 广泛支持各种认证模块。这些认证模块绝大多数
是第三方提供,或者相关的标准组织开发的,例如
。作为补充, 自己也提供了一些认证功能。
当前支持如下的认证技术。
!""#$!%&###'
(""#$!%&###'
)*+,-."$!%&###'
/($00"%10"#2
0'
0%&#"$101#'
!00#
%3!"$"44!24""
0'
".105"#
$5'# $0'
0600&%06"$&.
#%"1#0##10'
0"$400
#'
%"$4""11"##4"
#7#'
"#"8$'
!4"22#0$
!5"1##'
你自己的认证系统 $如下所示'
很多独立软件供应商$9'选择 是因为它具有丰富的认证模块。
这样无论他们的终端客户需要什么,他们都可以快速集成到他们的系统中,不
用花很多工夫或者让终端客户改变环境。如果 01
的 : 个认证模块还没有满足你的需求的话, 是一个开
放的系统,很容易写你自己的认证机制。许多 的企业用户需要
和“遗留”系统集成,这些遗留系统不遵循任何安全标准, 能够
和这样的系统“合作愉快”。
有时候基本的认证是不够的。有时候你需要根据 和应用交互的方式来应
用不同的安全措施。例如,你可能为了防止密码被窃取,或者防止终端用户受
到“中间人”攻击,需要保证到达的是请求通过 的。或者,你要确保是一
个真正的人而不是某种机器人或者自动进程在发送请求。这对于保护密码恢复
不受暴力破解攻击,或者防止他人很容易的复制你应用的关键内容。为了帮助
你实现这些目标, 完全支持自动“通道安全”$6"
6',以及集成 " 来检测是否是真正人类用户。
不仅提供了认证功能,而且提供了完备的授权功能。在授权方
面主要有三个领域,授权 4& 请求,授权方法调用,授权存取单个领域对象实
例。为了帮助你理解这些区别,对照考虑一下 规范中的 4& 模式安全
的授权功能, 容器管理安全以及文件系统安全。 提供了所
有这些重要领域的完备功能,我们将在本手册的后面介绍。
1.2. 历史
始于 ,,; 年晚期,当时在 ( 邮件列表中有
人提问是否有人考虑提供一个基于 的安全实现。当时, 的社区
是相对比较小的(尤其是和今天相比!),实际上 本身也是 ,,; 年早
期才作为一个 项目出现的。对此问题的回应是它确实是一个值
得研究的领域,虽然限于时间无法进行深入。
有鉴于此,这个简单的安全实现虽然构建了但是并没有发布。几周以后, 社
区的其他成员询问了安全框架,代码就被提供给了他们。
随后又有人请求,到了 ,,< 年一月,大约有 , 人左右在使用这些代码。另外
一些人加入到这些先行的用户中来,并建议建立一个 项目,这
个项目在 ,,< 年 ; 月建立起来。
在早期,该项目自身并布具备任何认证模块。认证过程依赖容器管理安全
(!5#)而 注重授权。在一开始
这样是合适的,但是随着越来越多的用户要求额外的容器支持,基于容器的认
证的限制就显示出来了。另外一个相关的问题是添加新的 文件到容器的
",通常会让最终用户感到困惑并且配置错误。
随后, 加入了认证服务。大约一年后, 成为了
一个 04 官方子项目。在 年半多的在多个软件项目中的活跃
使用以及数以百计的改进和社区贡献,=*,*, 最终版在 ,,> 年 + 月发布。
今天, 成为一个强大而活跃的社区。在支持论坛上有数以千计
的帖子。=< 位开发人员专职开发,一个活跃的社区也定期共享补丁并支持他们
的同侪。
1.3. 发行版本号
理解 的版本号是非常好处的,它可以帮助你判定升级的到新的
版本是否需要花费很大精力。我们的正式发行版本使用 "&
0? 版本指引,可以在下述网站查
看 "@AA*"*A*"0。为了您查看方便,我们引用该
页的说明部分如下:
B版本号由三个部分的整数组成:主版本号(5C)、副版本号(5DC)、补
丁版本号(! )。主要的含义是主版本号(5C)是不兼容的, 大
规模升级。副版本号(5DC)在源文件和可执行版和老版本保持兼容,补丁
版本号(! )则意味着向前和向后的完全兼容”。
第二章. 技术概览
2.1. 运行时环境
Acegi Security 可以在 JRE1.3 中运行。这个发行版本中支持也 Java 5.0,尽管对应的 Java 类
型被分开打包到一个后缀是“tiger”的包中。因为 Acegi Security 致力于以一种自包含的方式
运行,因此不需要在 JRE 中放置任何特殊的配置文件。特别无需配置 Java Authentication
and Authorization Service (JAAS)策略文件或者将 Acegi Security 放置到通用的 classpath 路径
中。
!
同样的,如果你使用 EJB 容器或者 Servlet 容器,同样无需放置任何特别的配置文件或者
将 Acegi Security 包含在服务器的类加载器(classloader)中。
!
上述的设计提供了最大的部署灵活性,你可以直接把目标工件( JAR, WAR 或者
EAR))直接从一个系统 copy 到另一个系统,它马上就可以运行起来。
!
2.2. 共享组件
让我们来看看 Acegi Security 中最重要的一些共享组件。所谓共享组件是指在框架中处于
核心地位,系统脱离了它们之后就不能运行。这些 Java 类型代表了系统中其他部分的构建
单元,因此理解它们是非常重要的,即使你不需要直接和它们打交道。
!
最基础的对象是 SecurityContextHolder。在这里存储了当前应用的安全上下文(security
context),包括正在使用应用程序的 principal 的详细信息。SecurityContextHolder 默认使
用 ThreadLocal 来存储这些详细信息,这意味着即便安全上下文(security context)没有被
作为一个参数显式传入,它仍然是可用的。如果在当前 principal 的请求处理后清理线程,那
么用这种方式使用 ThreadLocal 是非常安全的。当然, Acegi Security 自动为你处理这些,
所以你无需担心。
!
有些应用程序由于使用线程的方式而并不是完全适用 ThreadLocal。例如,Swing 客户端
可能 需 要 一 个 Java Virtual Machine 中的 所 有 线 程 都使 用 同 样 的 安全 上 下 文 ( security
context)。在这种情况下你要使用 SecurityContextHolder.MODE_GLOBAL 模式。另外一
些应用程序可能需要安全线程产生的线程拥有同样的安全标识符(security identity)。这可
以通过 SecurityContextHolder.MODE_INHERITABLETHREADLOCAL 来实现。你可以通过
两种方法来修改默认的 SecurityContextHolder.MODE_THREADLOCAL。第一种是设置一个
系统属性。或者,调用 SecurityContextHolder 的一个静态方法。大部分的应用程序不需要
修改默认值,不过如果你需要,那么请查看 SecurityContextHolder 的 JavaDocs 获取更多信
息。
!
我们在 SecurityContextHolder 中存储当前和应用程序交互的 principal 的详细信息。Acegi
Security 使用一个 Authentication 对象来代表这个信息。尽管你通常不需要自行创建一个
Authentication 对象,用户还是经常会查询 Authentication 对象。
你可以在你的应用程序中的任何地方使用下述的代码块:
java 代码
!
1. Object!obj!=!SecurityContextHolder.getContext().getAuthentication().getPrincipal();!!
2. if!(obj!instanceof!UserDetails)!{!!
3. String!username!=!((UserDetails)obj).getUsername();!!
4. }!else!{!!
5. String!username!=!obj.toString();!!
6. }!!
!
上 述 的 代 码 展 示 了 一 些 有 趣 的 联 系 和 关 键 的 对 象 。 首 先 , 你 会 注 意 到 在
SecurityContextHolder 和 Authentication 之 间 有 一 个 媒 介 对 象 。
SecurityContextHolder.getContext() 方法实际上返回一个 SecurityContext。Acegi Security 使
用若干个不同的 SecurityContext 实现,以备我们需要存储一些和 principal 无关的特殊信息。
一个很好的例子就是我们的 Jcaptcha 集成,它需要知道一个需求是否是由人发起的。这样
的判断和 principal 是否通过认证完全没有关系,因此我们将它保存在 SecurityContext 中。
!
从上述的代码片段可以看出的另一个问题是你可以从一个 Authentication 对象中获取一个
principal。Principal 只是一个对象。通常可以把它 cast 为一个 UserDetails 对象。UserDetails
在 Acegi Security 中是一个核心接口,它以一种扩展以及应用相关的方式来展现一个
principal 。 可 以 把 UserDetails 看 作 是 你 的 用 户 数 据 库 和 Acegi Security 在
SecurityContextHolder 所需要的东西之间的一个适配器(adapter)。作为你自己用户数据库
的一个展现,你可能经常要把它 cast 到你应用程序提供的原始对象,这样你就可以调用业
务相关的方法(例如 getEmail(), getEmployeeNumber())。
!
现在你可能已经开始疑惑,那我什么时候提供 UserDetails 对象呢?我要如何提供呢?
我想你告诉过我这个东西是声明式的,我不需要写任何 Java 代码-那怎么做到呢?对此
的简短回答就是有一个叫做 UserDetailsService 的特殊接口。这个接口只有一个方法,接受
一个 Sring 类型的参数并返回一个 UserDetails。Acegi Security 提供的大多数认证提供器将
剩余37页未读,继续阅读
_猪头饼_
- 粉丝: 25
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0