您的位置:首页 > 编程语言 > Java开发

Acegi (Spring Security)入门

2020-02-11 19:45 806 查看
一、Acegi Security 介绍

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

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

2006年5月—— acegi 1.0.0最终版本发布。

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

2009年7月——Spring Security 3.0已经发布

2010年7月——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框架中,SecurityContextHolder处于非常核心的位置,它是存放认证管理器用户安全信息SecurityContext的“容器”, SecurityContext保存着用户安全访问控制所需的信息,直接被访问决策管理器使用。

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



3、Acegi 实现以filter为中心














用户认证过程



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和环绕advice 。Acegi使用环绕advice对安全对象进行保护。 Acegi通AbstractSecurityInterceptor为安全对象访问提供一致的工作模型,它按照以下流程进行工作:



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

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

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

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

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





三、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、登录验证













3、方法保护








4、Domain Object安全(ACL)





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



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



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







lACL_READ指的是这个Voter对哪些SecurityConfig起作用。可以把ACL_READ配置在想要拦截的Method上。比方说要拦截readOrder这个方法,以实现ACL控制,可以这样配置orderManager.readOrder=ACL_READ
lprocessDomainObjectClass指出哪些DomainObject是要进行ACL校验的。
laclManager主要负责在权限列表根据用户和DomainObject取得acl列表。
lrequirePermission指出要进行这个操作必须具备的acl权限,比方说read操作就必须有ADMINISTRATION或READ两个权限
  • 点赞
  • 收藏
  • 分享
  • 文章举报
weisong0127 发布了14 篇原创文章 · 获赞 0 · 访问量 404 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: