[原创]Acegi
上一篇 / 下一篇 2007-05-24 14:11:49 / 个人分类:Acegi
1.1 Acegi安全框架简介
Ap9b&dj)BpM0Acegi安全框架是一个开放源码的项目,为企业应用提供全面的认证和授权服务,而且它是基于 Spring框架.。Acegi安全框架是一个强大的,灵活的安全解决方案的企业软件,其中特别着重于应用程序使用Spring框架。用acegi可以为应用提供全面的认证,授权,如存取控制、通道安全等等。
I r~9TF1L8}5s7?0Acegi安全框架的主要功能是:
-Q3cz3W nS*[01)稳定和成熟
TLO)h\)`:bd1g02)丰富的文档支持 海岸线网络聚合'Sp*DO2{4}
3)快速构建安全的系统 海岸线网络聚合FAP;N"j,?MP
OX
4)支持单点登陆(SSO) 海岸线网络聚合ihdKuX
5)使用Acegi时可以充分使用Spring的经验
leOn~dlf06)领域对象实体安全
#yNz0Q#c3R/G07)非侵入式安装 海岸线网络聚合uO0a)Q5]2pA8jC}ZU
8)完全(但是可以选择)的Web容器的整合 海岸线网络聚合$V&W
w8UC_l"ua
9)通道安全
8g"rE;q7WySp010)保护你的HTTP请求
2c,a,k`8k8iX)Y[011)支持基于表单认证
8YQ a(|m(B$xr012)支持HTTP BASIC认证
{d9g)n5O7hx013)支持HTTP Digest认证
NNi-X?.X(Yu$G XU014)支持X509认证 海岸线网络聚合B4T.mw{\(wu1jm
15)支持LDAP 海岸线网络聚合yM.e8Q0u
16)支持标签库 海岸线网络聚合7t[
m7~ `q'RSM
通过Ioc的XML 共享属性 或者JDK5的Annotation来配置Acegi 海岸线网络聚合QR2s6tA.L y'~`~
事件支持当然这些只是其中的一部份功能,Acegi安全框架比较庞大,它支持Java EE 5的安全性编程模型,并且Acegi更易用、功能更强大。人们使用Acegi Security有很多种原因,不过通常吸引他们到这个项目的原因是他们在J2EE的 Servlet Specification 或者 EJB Specification中找不到迫切需要的典型企业应用场景。提到这些规范,特别要提出的是他们不是在WAR或者EAR级别可移植的。这样,如果你切换服务器环境,一般来说你要在目标环境中花费很多工夫来重新配置你的应用安全。使用Acegi Security解决了这些问题,并且为你提供了很多其他有用的,完全可定制的安全特性。正如读者你刚看到的罗列了一部分Acegi的功能,Acegi支持了各种各样的认证,认证是安全的主要操作之一,为用户建立一个它所声明的principal。Principal通常代表用户,设备,或者其他能在你的应用中执行操作的其他系统。“授权”指判定一个principal能否在你的系统中执行某个操作。在到达授权判断之前,principal的的身份认证已经由认证过程执行过了。在Acegi中,除了支持各种认证模块外,还支持自己订制的认证模块。Acegi认证授权主要基于两大技术,一是Filter机制,二是AOP的拦截机制。通过FilterSecurityInterceptor很好地实现了对URI的保护,通过MethodSecurityInterceptor实现了对Service的方法的拦截保护,通过ACL 实现了对prototype类型的Object进行过滤和保护。 海岸线网络聚合+[ ~Z@t
x2`0s)~;z{
3W7R&Qb7|d8Z%n,Z01.2 安装Acegi框架
`
d^ v h01.2.1 建立Acegi-Demo目录结构 海岸线网络聚合%u]sM0^-_A
在Eclipse下创建一个Web工程,命名为Acegi-Demo,其目录结构如下图所示。
1.2.2 下载Acegi以及必要的JAR包Acegi主页的地址是:http://acegisecurity.org/笔者使用的Acegi版本是1.0.3,下载地址是:http://sourceforge.net/project/showfiles.php?group_id=104215 读者可以选择最近的镜像服务器来下载,速度会快一些。需要下载的是acegi-security-1.0.3.zip ,当然最好把acegi-security-1.0.3-src.zip也下下来,它包含了Acegi的源代码,阅读源代码可以更加深刻地理解该框架。除了acegi-security-1.0.3.jar外,还需要spring的jar包和日志的jar包等等。我将所有的Jar包罗列出来,读者可以很清晰的看到,当然也可以看项目中的.classpath文件,用记事本打开就可以看到该项目所需要的Jar包。
1cS7E%t d&D!{Ov0&?3\4Y2E+X/L4S Hp01.3 配置Acegi框架海岸线网络聚合u1o0t;[ M`3r
oc F*Cc6v
r01.3.1 配置web.xml文件
X$QR5hW/o0要将Acegi配置到web程序中,首先需要将Spring的DI容器装载到ServletContext中,即配置web.xml文件。然后配置在web.xml中配置Acegi的过滤器,因为Acegi是由过滤器驱动的。但是Acegi有许多的过滤器,我们不用全部写在web.xml的配置文件中,因为它提供了一个特殊的过滤器FilterToBeanProxy。下面给出了web.xml的完整代码:海岸线网络聚合8j B3T m3MJm'b1[R
HMk Yg8?0<?xml version="1.0" encoding="UTF-8"?>海岸线网络聚合*Mm]Z5~c
f.DVtx p0z)B"?0<web-app version="2.4"
jG/O;?#W.Oi0 海岸线网络聚合9l+U$p _;T9v*sy ?xmlns="http://java.sun.com/xml/ns/j2ee"
(|5}ut _9G3g0a b8GC,N8C X[0 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
MY!f[.atvZ-y7y0 海岸线网络聚合wU/e#F'Mxsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
7Uo1XwruR/w0e)SJP6m1H!n6`:m0 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
)J ]bg [c0 海岸线网络聚合o3R^B'm.? p$k<display-name>Acegi Demo</display-name>海岸线网络聚合#wtt d;j8f-X
海岸线网络聚合t3Q"X+} s*?J6N |,c5?'`3vZ&?T,U`:O$Prc9b0 海岸线网络聚合7V2h7v-UV;h,D`7?'z3]3`<context-param>海岸线网络聚合IdM#|!vZ$d._
!z!x9I/m#i%W]w0 <param-name>contextConfigLocation</param-name>海岸线网络聚合Br$XFj$k3ZGp
海岸线网络聚合0To??3?:E&_ t:_x<param-value>/WEB-INF/ applicationContext.xml</param-value>
Lk|~KT ^Z:Y h0 海岸线网络聚合x"T GE!gb.i&lQ</context-param>
4x#^7WwY'Uj%]0aV:\U YK0
A ~YMe0 海岸线网络聚合%RId#PW;Als%y<filter>海岸线网络聚合ok;q'K"sx/bp
海岸线网络聚合9js(YI+L+R1y<filter-name>Acegi Filter Chain Proxy</filter-name>
Sc#FTqb+eQ I0 海岸线网络聚合ET | w8B<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
]]O&y6]:K\0 海岸线网络聚合^9pA1Id+j n'L:B<init-param>海岸线网络聚合By.t@O
海岸线网络聚合`Ii C"?"e<param-name>targetBean</param-name>
N#F#~FCD{oc&e0 海岸线网络聚合*iUfO\o!lT<param-value>filterChainProxy</param-value>海岸线网络聚合Ms3i1wuw8J&X
6ncSX&| E'R6?:?0 </init-param>
'^'_3Mn!JDM1H0sG#h k2l2Q0 </filter>
:lQIE bA`0 海岸线网络聚合0ma } x?!sq0ZZH6BaM] Gquub0
*X!w[YA4P\j {0 <filter-mapping>海岸线网络聚合 mI;FDb? D`
海岸线网络聚合jv EAEr^<filter-name>Acegi Filter Chain Proxy</filter-name>
3`l5M+b7{'Z~S0Z-yd)X;p0 <url-pattern>/*</url-pattern>
~uY,}d"c2_T0 海岸线网络聚合a%\Ngg/N!fZ;l/{A</filter-mapping>海岸线网络聚合&h }3d^$Uq
海岸线网络聚合3R~$]"k#G];]海岸线网络聚合FBg#iy-F2e1G
(u[[o!r j0 <listener>
m's/X^#AgH/Dq6Gu0/L)n(_.m5d?3|`}0 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>海岸线网络聚合s;g:aNlI,e'D
海岸线网络聚合-~Eqx-] y#L@</listener>
(x y\kJ8?#_Z1o0 海岸线网络聚合'J"fDO u@ d}海岸线网络聚合 Y%H9@bcH
+y5{,UN8@HI{}F:b0 <welcome-file-list>海岸线网络聚合0] ^%j&g6M
|8a'A0H8B+qB9m0 <welcome-file>Login jsp</welcome-file>海岸线网络聚合 Uy-g)hF j~
海岸线网络聚合"i&~+X+b'q `T:o(p</welcome-file-list>
-C ^ Mv0L0Vjfz0Wu[FR`8W0</web-app>
4uUHj/Nr1S0
z Z.xH8D7n
S-XV*].KJ01.3.2 配置applicationContext.xml文件
5@/[6Y\h0配置Spring的配置文件是最重要的一步,通过filterChainProxy这个bean可以减少许多过滤器在web.xml中的配置。通过httpSessionContextIntegrationFilter这个bena可以读取Session里的身份验证。通过daoAuthenticationProvider这个bean可以读取存储在数据库中的用户身份信息。通过inMemDaoImpl这个bean可以读取存储在配置文件中的用户身份信息。当然用户信息也可以自己实现(只要实现userDetailsService接口就行)。
*Ek {7i.g.J*B'El_H0<?xml version="1.0" encoding="UTF-8"?>
#bY ]}6ug0