`
陈谏辉
  • 浏览: 49294 次
  • 性别: 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-security-tiger-1.0.0-RC2.jar.zip

    Acegi Security是一个已退役的安全框架,它为Java平台上的Spring框架提供了全面的身份验证和授权服务。这个"acegi-security-tiger-1.0.0-RC2.jar.zip"压缩包包含的是Acegi Security的一个早期版本——1.0.0 Release ...

    Acegi-security-samples-tutorial-1.0.7.zip 实例代码解析

    1. **配置类**:这些类通常会定义Acegi Security的配置,包括定义访问决策管理者(AccessDecisionManager),身份提供者(AuthenticationProvider),以及安全拦截器链(FilterSecurityInterceptor)。例如,`...

    ldap与Acegi? ----Acegi配置文件解剖

    **LDAP与Acegi安全框架** 在Java Web开发中,安全是一个至关重要的方面,尤其是在企业级应用中。LDAP(轻量级目录访问协议)通常用于管理用户身份验证和授权,而Acegi Security是Spring Framework的一个扩展,它...

    acegi-security-tiger-1.0.7.jar

    这个版本的jar文件"acegi-security-tiger-1.0.7.jar"是该框架的核心库,包含了实现安全控制的所有类和接口,使得开发者能够更方便地管理用户的登录、权限分配以及访问控制。 Acegi Security的主要功能包括: 1. **...

    Acegi学习笔记--Acegi详解实战Acegi实例

    2. **Spring配置**:定义`&lt;security:global-method-security&gt;`来启用方法级别的安全控制。 3. **Bean配置**:配置`AuthenticationProvider`,如`DaoAuthenticationProvider`,并定义用户凭证的存储方式。 四、Acegi...

    acegi-security-jetty-0.8.3.jar.zip

    Acegi Security是一个历史悠久的安全框架,它为Java应用提供了一套全面的身份验证和授权服务。这个框架在Spring社区中被广泛使用,特别是在Spring MVC和Jetty服务器的集成项目中。"acegi-security-jetty-0.8.3.jar....

    acegi-security-catalina-1.0.7.jar.zip

    Acegi Security的主要功能包括身份验证、授权、会话管理以及请求过滤,它通过与Spring框架的深度融合,使得开发者能够轻松地在应用中实现安全控制。1.0.7版本可能包含了当时已知的安全修复和性能优化。 "acegi-...

    acegi-security-resin-0.8.3.jar.zip

    Acegi Security Resin 0.8.3 是一个专门针对Java Web应用的安全框架,它为Spring框架提供了强大的安全控制和身份验证功能。这个版本的jar.zip包包含了Acegi Security与Resin服务器集成的特定实现,使得Resin用户可以...

    acegi-security-1.0.4.jar.zip

    Acegi Security是一个已退役的安全框架,它在Java社区中曾被广泛使用,特别是在Spring MVC的早期版本中。这个框架提供了一套全面的访问控制和身份验证解决方案,旨在增强基于Java的应用程序的安全性。 Acegi ...

    acegi-security-1.0.7-osgi.jar.zip

    它通过提供一系列可配置的拦截器和策略,使得安全控制能够无缝集成到Spring MVC和Spring事务管理中。 Acegi Security 1.0.7是该框架的一个特定版本,发布于2007年,包含了对当时已知问题的修复和改进。它支持多种...

    acegi-security-1.0.7.jar.zip

    总的来说,"acegi-security-1.0.7.jar.zip"包含了一个过时但曾经非常流行的Java安全框架,它的使用需要对Spring框架有一定的了解,同时也需要掌握声明式安全控制的概念和实践。尽管现在可能更多的是转向Spring ...

    acegi-security-taglib-0.6.jar.zip

    Acegi Security Taglib是Acegi安全框架的一部分,它是一个用于Spring框架的安全解决方案,提供了一整套功能强大的安全特性。这个0.6版本的jar文件包含了用于Web应用的安全控制和访问控制的标签库,使得开发者能够...

    acegi-security-resin-0.8.1.1.jar.zip

    1. Acegi Security是Spring生态中的一个安全框架,提供了强大的安全控制功能。 2. `acegi-security-resin-0.8.1.1.jar`是Acegi Security针对Resin应用服务器的特定版本实现,用于增强Resin的安全性。 3. Spring ...

    acegi-security-resin-1.0.7.jar.zip

    Acegi Security是一款在Java应用程序中实现安全控制的框架,它为Spring框架提供了强大的身份验证和授权功能。在Java世界中,安全通常是应用开发中的一个重要环节,Acegi Security为开发者提供了全面的安全解决方案,...

    acegi-security-0.8.3.jar.zip

    在这个压缩包中,`acegi-security-0.8.3.jar` 是核心的安全库,包含所有必要的类和资源,开发者可以将其引入项目中来实现安全控制。由于Acegi Security是基于Spring框架设计的,所以它与Spring有着紧密的集成,能够...

    acegi-security-catalina-server.jar.zip

    Acegi Security通过Spring的依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming)能力,使得安全控制能够轻松地融入到应用程序的各个层面。 Catalina是Apache Tomcat服务器的核心部分,...

    acegi-security-jboss-1.0.7.jar.zip

    同时,确保你的项目配置符合Acegi Security的要求,包括设置安全相关的bean和配置文件。如果你的项目已经使用了Spring,那么集成Acegi Security将相对容易,因为它们的设计理念和API有很好的契合性。 总的来说,...

    acegi-security-resin-lib-0.6.1.jar.zip

    它通过与Spring框架的紧密集成,使得开发者可以方便地在Spring应用中实现安全控制,而无需深入理解底层的复杂细节。0.6.1是Acegi Security的一个早期版本,可能包含了基本的身份验证机制、角色授权、基于表达式的...

    acegi-security-0.6.1.jar.zip

    在0.6.1版本中,可能包括了对HTTP基本认证、表单登录、方法级别安全控制、基于角色的访问控制(RBAC)等特性的支持。 "acegi-security-0.6.1.jar"是Acegi Security的主库文件,包含了所有必要的类和资源,使得...

Global site tag (gtag.js) - Google Analytics