`
陈谏辉
  • 浏览: 48303 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

acegi"安全控制"的设置-1

阅读更多

acegi安全系统,是个用于spring framework的安全框架,能够和目前流行的web容器无缝集成。他使用了spring的方式提供了安全和认证安全服务,包括使用bean context,拦截器和面向接口的编程方式。因此,acegi安全系统能够轻松地适用于复杂的安全需求。
安全涉及到两个不同的概念,认证和授权。前者是关于确认用户是否确实是他们所宣称的身份。授权则是关于确认用户是否有允许执行一个特定的操作。
在acegi安全系统中,需要被认证的用户,系统或代理称为"principal"。acegi安全系统和其他的安全系统不同,他并没有角色和用户组的概念。

acegi系统设计

关键组件

acegi安全系统包含以下七个关键的功能组件:
lauthentication对象,包含了principal,credential和principal的授权信息。同时还能包含关于发起认证请求的客户的其他信息,如ip地址。
2contextholder对象,使用threadlocal储存authentication对象的地方。
3authenticationmanager,用于认证contextholder中的authentication对象。
4accessdecissionmanager,用于授权一个特定的操作。
5runasmanager,当执行特定的操作时,用于选择性地替换authentication对象。
6secure object拦截器,用于协调authenticationmanager,accessdecissionmanager,runasmanager和特定操作的执行。
7objectdefinitionsource,包含了特定操作的授权定义。

这七个关键的功能组件的关系如下图所示(图中灰色部分是关键组件):


安全管理对象

acegi安全系统目前支持两类安全管理对象。
第一类的安全管理对象管理aop alliance的methodinvocation,研发人员能用他来保护spring容器中的业务对象。为了使spring管理的bean能作为 methodinvocation来使用,bean能通过proxyfactorybean和beannameautoproxycreator来管理, 就像在spring的事务管理相同使用。
第二类是filterinvocation。他用过滤器(filter)来创建,并简单地包装了http的 servletrequest,servletresponse和filterchain。filterinvocation能用来保护http资源。通 常,研发人员并不必了解他的工作机制,因为他们只需要将filter加入web.xml,acegi安全系统就能工作了。

安全设置参数

每个安全管理对象都能描述数量不限的各种安全认证请求。例如,methodinvocation对象能描述带有任意参数的任意方法的调用,而filterinvocation能描述任意的http url。
acegi安全系统需要记录应用于每个认证请求的安全设置参数。例如,对于bankmanager.getbalance(int accountnumber)方法和bankmanager.approveloan(int applicationnumber)方法,他们需要的认证请求的安全设置非常不相同。
为了保存不同的认证请求的安全设置,需要使用设置参数。从实现的视角来看,设置参数使用configattribute接口来表示。acegi安全系统提 供了configattribute接口的一个实现,securityconfig,他把设置参数保存为一个字符串。
configattributedefinition类是configattribute对象的一个简单的容器,他保存了和特定请求相关的configattribute的集合。
当安全拦截器收到一个安全认证请求时,需要决定应用哪一个设置参数。换句话说,他需要找出应用于这个请求的 configattributedefinition对象。这个查找的过程是由objectdefinitionsource接口来处理的。这个接口的主 要方法是public configattributedefinition getattributes(object object),其中object参数是个安全管理对象。因为安全管理对象包含有认证请求的周详信息,所以objectdefinitionsource 接口的实现类能从中获得所需的周详信息,以查找相关的configattributedefiniton对象。

acegi怎么工作

为了说明acegi安全系统怎么工作,我们设想一个使用acegi的例子。通常,一个安全系统需要发挥作用,他必须完成以下的工作:
l首先,系统从客户端请求中获得principal和credential;
2然后系统认证principal和credential信息;
3如果认证通过,系统取出principal的授权信息;
4接下来,客户端发起操作请求;
5系统根据预先设置的参数检查principal对于该操作的授权;
6如果授权检查通过则执行操作,否则拒绝。

那么,acegi安全系统是怎么完成这些工作的呢?首先,我们来看看acegi安全系统的认证和授权的相关类图:

图中绿色部分是安全拦截器的抽象基类,他包含有两个管理类,authenticationmanager和accessdecisionmanager, 如图中灰色部分。authenticationmanager用于认证contextholder中的authentication对象(包含了 principal,credential和principal的授权信息);accessdecissionmanager则用于授权一个特定的操作。
下面来看一个methodsecurityinterceptor的例子:
<bean id="bankmanagersecurity"
class="net.sf.acegisecurity.intercept.method.methodsecurityinterceptor">
<property name="validateconfigattributes">
<value>true</value>
</property>
<property name="authenticationmanager">
<ref bean="authenticationmanager"/>
</property>
<property name="accessdecisionmanager">
<ref bean="accessdecisionmanager"/>
</property>
<property name="objectdefinitionsource">
<value>
net.sf.acegisecurity.context.bankmanager.delete*=
role_supervisor,run_as_server
net.sf.acegisecurity.context.bankmanager.getbalance=
role_teller,role_supervisor,banksecurity_customer,run_
</value>
</property>
</bean>

上面的设置文件中,methodsecurityinterceptor是abstractsecurityinterceptor的 一个实现类。他包含了两个管理器,authenticationmanager和accessdecisionmanager。这两者的设置如下:

<bean id="authenticationdao" class="net.sf.acegisecurity.providers.dao.jdbc.jdbcdaoimpl">
<property name="datasource"><ref bean="datasource"/></property>
</bean>
<bean id="daoauthenticationprovider"
class="net.sf.acegisecurity.providers.dao.daoauthenticationprovider">
<property name="authenticationdao"><ref bean="authenticationdao"/></property>
</bean>
<bean id="authenticationmanager" class="net.sf.acegisecurity.providers.providermanager">
<property name="providers">
<list><ref bean="daoauthenticationprovider"/></list>
</property>
</bean>

<bean id="rolevoter" class="net.sf.acegisecurity.vote.rolevoter"/>
<bean id="accessdecisionmanager" class="net.sf.acegisecurity.vote.affirmativebased">
<property name="allowifallabstaindecisions"><value>false</value></property>
<property name="decisionvoters">
<list><ref bean="rolevoter"/></list>
</property>
</bean>

准备工作做好了,目前我们来看看acegi安全系统是怎么实现认证和授权机制的。以使用http basic认证的应用为例子,他包括下面的步骤:
1.用户登录系统,acegi从acegisecurity.ui子系统的安全拦截器(如basicprocessingfilter)中得到用户的登 录信息(包括principal和credential)并放入authentication对象,并保存在contextholder对象中;
2.安全拦截器将authentication对象交给authenticationmanager进行身份认证,如果认证通过,返回带有 principal授权信息的authentication对象。此时contextholder对象的authentication对象已拥有 principal的周详信息;
3.用户登录成功后,继续进行业务操作;
4.安全拦截器(bankmanagersecurity)收到客户端操作请求后,将操作请求的数据包装成安全管理对象(filterinvocation或methodinvocation对象);
5.然后,从设置文件(objectdefinitionsource)中读出相关的安全设置参数configattributedefinition;
6.接着,安全拦截器取出contextholder中的authentication对象,把他传递给authenticationmanager进行身份认证,并用返回值更新contextholder的authentication对象;
7.将authentication对象,configattributedefinition对象和安全管理对象(secure object)交给accessdecisionmanager,检查principal的操作授权;
8.如果授权检查通过则执行客户端请求的操作,否则拒绝;

accessdecisionvoter

注意上节的accessdecisionmanager是个affirmativebased类,他对于用户授权的投票策略是,只要通过其中的一个授权投 票检查,即可通过;他的allowifallabstaindecisions属性值是false,意思是如果所有的授权投票是都是弃权,则通不过授权检 查。
acegi安全系统包括了几个基于投票策略的accessdecisionmanager,上节的rolevoter就是其中的一个投票策略实现,他是 accessdecisionvoter的一个子类。accessdecisionvoter的具体实现类通过投票来进行授权决 策,accessdecisionmanager则根据投票结果来决定是通过授权检查,还是抛出accessdeniedexception例外。
accessdecisionvoter接口共有三个方法:
public int vote(authentication authentication, object object, configattributedefinition config);
public boolean supports(configattribute attribute);
public boolean supports(class clazz);
其中的vote方法返回int返回值,他们是accessdecisionvoter的三个静态成员属性:access_abstain,,access_denied和access_granted,他们分别是弃权,否决和赞成。
acegi安全系统中,使用投票策略的accessdecisionmanager共有三个具体实现类:affirmativebased、 consensusbased和unanimousbased。他们的投票策略是,affirmativebased类只需有一个投票赞成即可通 过;consensusbased类需要大多数投票赞成即可通过;而unanimousbased类需要所有的投票赞成才能通过。
rolevoter类是个acegi安全系统accessdecisionvoter接口的实现。如果configattribute以role_开 头,rolevoter则进行投票。如果grantedauthority的getautority方法的string返回值匹配一个或多个以role_ 开头的configattribute,则投票通过,否则不通过。如果没有以role_开头的configattribute,rolevoter则弃 权。

安全拦截器

拦截器怎么工作
methodinvocation拦截器
filterinvocation拦截器

认证

认证请求
认证管理器
authentication provider

授权

access decision manager
voting decision manager
授权管理推荐

contextholder的用户接口

用户接口目标
http会话认证
http basic认证
分享到:
评论

相关推荐

    Acegi-spring安全框架

    Acegi能做什么 Acegi的体系结构 Acegi核心组件 典型的web认证过程 Acegi的登陆认证 Acegi对安全对象的访问控制 Filter 组件 Acegi的不足之处

    Acegi安全系统介绍.doc

    Acegi安全系统介绍 1 1.1 介绍 1 1.2 管理身份验证 3 1.3 控制访问 20 1.4 保护Web应用程序 24 1.5 保护方法调用 29 1.6 领域对象安全(Domain Object Security) 31

    Spring Acegi权限控制

    Spring Acegi权限控制,安全系统就只包括两个问题: 认证和授权.

    Acegi安全系统详解

    Acegi是Spring Framework 下最成熟的安全系统,它提供了强大灵活的企业级安全服务,如: 1 : 完善的认证和授权机制, 2 : Http资源访问控制, 3 : Method调用访问控制, 4 : Access Control List (ACL) 基于对象...

    Acegi安全系统详解.doc

    Acegi安全系统详解,介绍安全认证框架,用户认证,权限控制等

    Acegi安全系统介绍(一)

    Acegi是SpringFramework下最成熟的安全系统,它提供了强大灵活的企业级安全服务,如:完善的认证和授权机制,Http资源访问控制,Method调用访问控制,AccessControlList(ACL)基于对象实例的访问控制,...

    acegi的使用

    好资料,大家一起分享,用户javaweb开发的权限和安全控制

    关于web spring acegi 权限配置xml

    如何定义spring security的安全认证框架,对url和系统类method进行过滤以及权限分配和控制

    Acegi安全框架下实现的通用权限管理系统 (2010年)

    把Acegi安全框架引入到SSH(表现层+控制层+持久层)架构中,对Acegi安全框架进行配置动态扩展,实现一个通用权限管理子系统畅对可能出现的问题进行分析,分别给出相应的解决方案。把子系统应用到一个账单管理系统中,其...

    Acegi + Spring + Hibernate + Struts2搭建

    Acegi是一个可插拔框架,主要是在SSH框架上插入Acegi安全框架。

    Acegi 数据库配置安全策略 源代码及图解

    注:此为王政 所作,个人在网上淘到,与各位 做用户管理的朋友分享!内包含 转换XML 配置策略到数据库动态配置安全策略,及一些UML图解

    Acegi配置指南

    Acegi是基于Spring Web应用的安全框架,即是“声明式”的访问安全控制的解决方案,用户基本上不需编写代码而仅通过配置就可以实施应用系统的安全。

    基于Acegi的Web系统安全架构的设计与实现 (2011年)

    分析了Acegi安全框架,讨论了Acegi安全访问控制粒度问题,以及认证与授权过程.通过应用Aeegi设计实现了一个实际网站的安全系统,并验证了Acegi框架对保护Web应用程序安全、有效、可行.

    Acegi (和spring 的AOP关系)

    三大组件(安全控制组件,拦截器,资源安全管理)

    简单acegi程序

    在应用系统开发的过程中权限的设置和用户的安全管理是系统中不可缺少的部分,但如果自己去实现有时因为项目的原因可能就会在后期忽略了这块,在spring中有集成了这个部分,感谢spring 给我们带来了这么好的东西。

    基于Spring框架应用的权限控制系统的研究和实现

    本文探讨了Acegi安全框架中各部件之间的交互,并通过扩展Acegi数据库设计来实现基于Spring框架的应用的安全控制方法。 关键词Spring;Acegi;认证;授权1引言 近年来,随着Internet技术的迅猛发展,计算机网络已...

    Spring Security-3.0.1中文官方文档(翻译版)

    16. acegi 到spring security 的转换方式 16.1. Spring Security 是什么 16.2. 目标 16.3. 步骤 16.4. 总结 V. 高级话题 17. 领域对象安全(ACLs) 17.1. 概述 17.2. 关键概念 17.3. 开始 18. 预...

    关于web spring acegi 权限配置xml(补充)

    如何定义spring security的安全认证框架,对url和系统类method进行过滤以及权限分配和控制(补充) 关于DataBaseFilterInvocationDefinitionSource.java的实现

Global site tag (gtag.js) - Google Analytics