Acegi (Spring Security)入门

一、Acegi Security  介绍

 

    1、为基于J2EE企业应用提供了全面安全服务 

l将系统的安全逻辑从业务中分离出来
l提供很多认证授权策略
l基于URLWEB资源访问控制
l业务方法调用访问控制
l领域对象访问控制  Access Control ListACL
l单点登录(Central Authentication Service缓存、信道安全(Channel Security)管理等功能
2、Acegi发展历史
2003年初——Spring本身作为一个sourceforge的项目出现。

2003年年底——acegi开始,当时叫springacegi安全系统

20065——acegi1.0.0最终版本发布。

2007年年底——成为spring组合项目,更名Spring Security

20097——Spring Security 3.0已经发布

20107——Spring Security 3.1已经发 

3、安全原理

 

 安全包括认证授权两个主要操作。

认证是为用户建立一个他所声明的主体。主体一般是指用户,设备或可以在你系统中执行行动的其他系统。

授权指的一个用户能否在你的应用中执行某个操作。在到达授权判断之前,身份的主体已经由身份验证过程建立了。

 这些概念是通用的,不是Spring Security特有的。

  

Spring Acegi拥有丰富灵活的认证模型,列举几个认证技术:

 

HTTP BASIC authentication headers (一个基于IEFT RFC的标准)

 

LDAP (一个非常常见的跨平台认证需要做法,特别是在大环境)

 

JA-SIG Central Authentication Service (也被称为CAS,这是一      个流行的开源单点登录系统)

 

Java Authentication and Authorization Service (JAAS)

 

Form-based authentication (提供简单用户接口的需求)

 

Spring Acegi在授权方面主要有三个领域

 

 

l授权web请求
 
l授权被调用方法
 
l授权访问单个对象的实例
 
 
二 、Acegi Security  原理
 
1、乘飞机的安全问题
 

乘飞机前需要通过安检,乘客必须提供身份证以验证其身份。在通过安检进入候机室后,国航、海航、南航等不同航空公司的飞机陆续到达,但你只能登上机票上对应航班的飞机。在登机后,只能坐在机票对应的座位上——你不能抢占他人的座位,你不能在座位上刻字留念、你不能要求空姐打开机窗……

  乘飞机的过程体现安全控制的流程:

 

 

安检--身份认证

 

 

登机--资源访问控制

 

 

按号就座领域对象安全控制

 

2、Acegi架构

 

 

Acegi通过两个组件对象完成安全问题的处理:

 

AuthenticationManager(认证管理器)

 

AccessDecisionManager(访问控制管理器或者叫授权管理器)

 

Acegi (Spring Security)入门_第1张图片

 

Acegi框架中,SecurityContextHolder处于非常核心的位置,它是存放认证管理器用户安全信息SecurityContext容器SecurityContext保存着用户安全访问控制所需的信息,直接被访问决策管理器使用。

    HttpSessionContextIntegrationFilter通过在SecurityContextHolderHttpSession中摆渡SecurityContext,使多个请求线程可以共享同一SecurityContext

 

3、Acegi实现以filter为中心

 

 

Acegi (Spring Security)入门_第2张图片 

 

   Acegi (Spring Security)入门_第3张图片

 

 

 用户认证过程

 

Acegi支持多种方式的用户认证:如典型的基于数据库的认证、基于LDAP的认证等。先抛开细节,看一下Acegi对受限资源进行访问控制的典型过程:

1.你点击一个链接访问一个网页;

2.浏览器发送一个请求到服务器,服务器判断出你正在访问一个受保护的资源;

3.如果此时你并未通过身份认证,服务器发回一个响应提示你进行认证——这个响应可能是一个HTTP响应代码,抑或重定向到一个指定页面;

4.根据系统使用认证机制的不同,浏览器或者重定向到一个登录页面中,或者由浏览器通过一些其它的方式获取你的身份信息(如通过BASIC认证对话框、一个Cookie);

5.浏览器再次将用户身份信息发送到服务器上(可能是一个用户登录表单的HTTP POST信息、也可能是包含认证信息的HTTP报文头);

6.服务器判断用户认证信息是否有效,如果无效,一般情况下,浏览器会要求你继续尝试,这意味着返回第3步。如果有效,则到达下一步;

7.服务器重新响应第2步所提交的原始请求,并判断该请求所访问的程序资源是否在你的权限范围内,如果你有权访问,请求将得到正确的执行并返回结果。否则,你将收到一个HTTP 403错误,这意味着你被禁止访问。

 

 授权过程

 

 

Acegi称受保护的应用资源为安全对象,这包括URL资源和业务类方法。spring AOP中有前置advice(处理、拦截器、通知)、后置advice、异常advice和环绕adviceAcegi使用环绕advice对安全对象进行保护。 AcegiAbstractSecurityInterceptor为安全对象访问提供一致的工作模型,它按照以下流程进行工作:

 

1. 从SecurityContext中取出已经认证过的Authentication(包括权限信息);

2. 通过反射机制,根据目标安全对象和配置属性得到访问目标安全对象所需的权限;

3AccessDecisionManager根据Authentication的授权信息和目标安全对象所需权限做出是否有权访问的判断。如果无权访问,Acegi将抛出AccessDeniedException异常,否则到下一步;

4. 访问安全对象并获取结果(返回值或HTTP响应);

5AbstractSecurityInterceptor可以在结果返回前进行处理:更改结果或抛出异常。

 

 

三、Acegi Security配置

 

1、基本环境配置

 

第一步确保jar文件放到正确的位置(/WEB-INF/lib/

acegi-security-1.0.1.jar
aopalliance-1.0.jar
spring-2.0.2.jar
等相关jar
第二步,web.xml文件里配置一个FilterToBeanProxy

<filter>

    <filter-name>securityFilter</filter-name>

    <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>

    <init-param>

      <param-name>targetBean</param-name>

      <param-value>filterChainProxy</param-value>

    </init-param>

  </filter>

 

  <filter-mapping>

    <filter-name>securityFilter</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>

 

第三步applicationContext-security.xml文件的配置

 <bean id="filterChainProxy"   class="org.acegisecurity.util.FilterChainProxy">

        <property name="filterInvocationDefinitionSource">

            <value>

                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON

                PATTERN_TYPE_APACHE_ANT                /**=httpSessionContextIntegrationFilter,userPreferencesFilter,authenticationProcessingFilter </value>

        </property>

    </bean>

2、登录验证

 Acegi (Spring Security)入门_第4张图片

Acegi (Spring Security)入门_第5张图片

Acegi (Spring Security)入门_第6张图片

 Acegi (Spring Security)入门_第7张图片

Acegi (Spring Security)入门_第8张图片

 

 

 

3、方法保护

 

Acegi (Spring Security)入门_第9张图片

 

 

4、Domain Object安全(ACL

 

 

ACL用来做细粒度权限控制所用的一种权限模型。具体到每一条数据的权限。保障Domain Object安全。

 

 ACL最简单的描述——两个业务员每个人只能查看操作自己签的合同,而不能看到对方的合同信息。

 

 最典型的ACL实现——操作系统(window, unix)的文件访问控制系统,精确定义了某个用户或角色对某个特定文件的读、写、执行等权限。

Acegi (Spring Security)入门_第10张图片

Acegi (Spring Security)入门_第11张图片

 

 

l ACL_READ 指的是这个 Voter 对哪些 SecurityConfig 起作用。可以把 ACL_READ 配置在想要拦截的 Method 上。比方说要拦截 readOrder 这个方法,以实现 ACL 控制,可以这样配置 orderManager.readOrder =ACL_READ
lprocessDomainObjectClass指出哪些DomainObject是要进行ACL校验的。
laclManager主要负责在权限列表根据用户和DomainObject取得acl列表。
lrequirePermission指出要进行这个操作必须具备的acl权限,比方说read操作就必须有ADMINISTRATIONREAD两个权限。

 

 

你可能感兴趣的:(spring,Security)