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

本文介绍了ACEGI安全系统,这是一个与Spring框架紧密结合的安全框架。它包括了认证和授权两大核心功能,通过七个关键组件实现复杂的安全需求。文章还详细解释了ACEGI如何通过配置属性、安全管理对象等机制实现灵活的安全策略。

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认证
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值