`
xgbjmxn
  • 浏览: 268599 次
  • 性别: Icon_minigender_1
  • 来自: 新乡
社区版块
存档分类
最新评论

(转)Acegi配置文档

阅读更多


(转)Acegi配置文档
.
分类: Acegi2008-02-04 10:19540人阅读评论(0)收藏举报

Acegi配置文档
作者:javafish(likunkun)
Email:javafish@sunxin.org
Acegi是基于Spring的一个开源的安全认证框架,现在的最新版本是1.04。Acegi的特点就是有很多的过滤器:不过我们也用不到这么多的过滤器,只是可以把它们看作为一个个的模块,在用的时候加上自己用的着的即可,由于认证的流程的方面比较复杂导致它的配置很复杂,如果能摸清它的工作原理还是不太难.下面用比较顺着人思维的流程过一遍
这里只列出常用的过滤器和拦载器
1. 过滤器:HttpSessionContextIntegrationFilter,authenticationProcessingFilter,BasicProcessingFilter,RememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter
2. 拦截器:filterSecurityInterceptor(其实它是过滤器,不过把它放在这里更能说明它的功能),methodSecurityInterceptor
看着上面的用红色标出的过滤器是用来认证(表单和HTTP基本认证,当然还有别的不过这两个比较长用)它们是资源访问的入口.其它的过滤器是用来辅助的:HttpSessionContextIntegrationFilter是用来把认证信息记录到Session中的RememberMeProcessingFilter是以cookie的形式来保存认证信息的. anonymousProcessingFilter是在匿名的时候(这时候是没有认证信息的)给这个用户分配一个匿名的认证信息,exceptionTranslationFilter总结一下异常并处理.在实际中选择适合程序的即可.
上面只是资源访问的入口,真正保护资源的是这两个拦截器:filterSecurityInterceptor,拦截URL的类(它是个过滤器)
metohdSecurityInterceptor,拦截类中方法的调用,它们为什么要拦截呢?就是想在访问或调用这些方法之前来判断一下用户是否有访问或调用的权限,有就通过,没有就踢出.
除此之外,Acegi专门做了两个管理器(实际上就是两个类,为什么会用做这两个管理器,因为认证和授权都有一些的操作,这就需要专门做两个管理器了):authenticationManager(class= org.acegisecurity.providers.ProviderManager),授权管理器accessDecisionManager(class=org.acegisecurity.vote.AffirmativeBased)
说白了一个用于认证用户,一个是用于权限的授于的
先来说认证用户,认证管理器有什么东西呢?只内置了一些提供者:这些提供者呢又是什么呢,他们是提供用户的验证身份信息的,比如从数据库或配置文件里读出用户名和密码,在用户的cookie里读出身份信息(rememberMeProcessingFilter用到的[前面讲了的,有印象吧]),或在Session里读出身份验证信息(HttpSessionContextIntegrationFilter起作用的),这里我们只说一下从数据库或配置文件里读出用户名密码来装配验证信息的,其它的配置类似可以找一下对应api在Spring里配置即可,daoAuthenticationProvider是数据库的提供者class=org.acegisecurity.providers.dao.DaoAuthenticationProvider,而它提供的服务呢又有几种,数据库和配置文件(这是Acegi的两个默认的实现)当然也可以自己实现(实现userDetailsService接口就行)



Java代码
01.<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">  
02.        <property name="providers">  
03.            <list>  
04.                <ref local="daoAuthenticationProvider"/>  
05.            </list>  
06.        </property>  
07.    </bean>  
08.<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">  
09.        <!-- <property name="userDetailsService"><ref local="InMemoryDaoImpl"/></property> --><!-- 这里有两种选择 -->  
10.        <property name="userDetailsService"><ref local="jdbcDaoImpl"/></property>  
11.    </bean> 



view plaincopy to clipboardprint?
01.<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"> 
02.        <property name="providers"> 
03.            <list> 
04.                <ref local="daoAuthenticationProvider"/> 
05.            </list> 
06.        </property> 
07.    </bean> 
08.<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> 
09.        <!-- <property name="userDetailsService"><ref local="InMemoryDaoImpl"/></property> --><!-- 这里有两种选择 --> 
10.        <property name="userDetailsService"><ref local="jdbcDaoImpl"/></property> 
11.    </bean> 

如果用户名和密码在配置文件里可以用InMemoryDaoImpl,class=org.acegisecurity.userdetails.memory.InMemoryDaoImpl,在这个类的userMap里配置即可:javafish=java,ROLE_USER,配置了一个用户名为javafish,密码为java,用户组为ROLE_USER的用户,不过最常用的还是数据库的JDBC实现(两个二选一)org.acegisecurity.userdetails.jdbc.JdbcDaoImpl里面需要usersByUsernameQuery和authoritiesByUsernameQuery还有数据源dataSource(有人问为什么呢,userByUsernameQuery是用来通过用户名来查密码的,authoritiesByUsernameQuery是用来通过用户名来查权限的,查询数据库肯定的用数据源吧这个里是用的SpringFrameWork的DataSource)它们查询的sql语句是有讲究的,就是查密码的时候查三个第一个是username,第二个是password,第三个是是否可用,查权限的时候查两个:username和authorities(具体看例子)



Java代码
01.<bean id="InMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">  
02.        <property name="userMap">  
03.            <value>  
04.                javafish=java,ROLE_USER  
05.            </value>  
06.        </property>  
07.    </bean>  
08.    <bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">  
09.        <property name="usersByUsernameQuery">  
10.            <value>select username,password,enabled from users where username=?</value>  
11.        </property>  
12.        <property name="authoritiesByUsernameQuery">  
13.            <value>select username,authority from authorities where username=?</value>  
14.        </property>  
15.        <property name="dataSource">  
16.            <ref local="dataSource"/>  
17.        </property>  
18.    </bean>  
19.      
20.    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
21.        <property name="driverClassName">  
22.            <value>com.mysql.jdbc.Driver</value>  
23.        </property>  
24.        <property name="url">  
25.            <value>jdbc:mysql://localhost:3306/test</value>  
26.        </property>  
27.        <property name="username">  
28.            <value>root</value>  
29.        </property>  
30.        <property name="password">  
31.            <value>javafish</value>  
32.        </property>  
33.    </bean> 



view plaincopy to clipboardprint?
01.<bean id="InMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl"> 
02.        <property name="userMap"> 
03.            <value> 
04.                javafish=java,ROLE_USER 
05.            </value> 
06.        </property> 
07.    </bean> 
08.    <bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"> 
09.        <property name="usersByUsernameQuery"> 
10.            <value>select username,password,enabled from users where username=?</value> 
11.        </property> 
12.        <property name="authoritiesByUsernameQuery"> 
13.            <value>select username,authority from authorities where username=?</value> 
14.        </property> 
15.        <property name="dataSource"> 
16.            <ref local="dataSource"/> 
17.        </property> 
18.    </bean> 
19.     
20.    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
21.        <property name="driverClassName"> 
22.            <value>com.mysql.jdbc.Driver</value> 
23.        </property> 
24.        <property name="url"> 
25.            <value>jdbc:mysql://localhost:3306/test</value> 
26.        </property> 
27.        <property name="username"> 
28.            <value>root</value> 
29.        </property> 
30.        <property name="password"> 
31.            <value>javafish</value> 
32.        </property> 
33.    </bean> 

下面说一下授权,授权管理器又有什么东西呢?accessDecisionManager,Acegi把授权方面弄的比较的形象化,把某个URL或方法是否可以被访问按投票的形式来决定,

Acegi提出来了几种方案:
1. 如果有一个赞成就同意(具体的说就是只要你在那个URL对应的几个用户组中的一个就让你访问)
2. 如果都赞成就同意(具本的说就是那个URL对应的几个用户组里都有你,你才能访问)
3. 如果都不反对就同意(这个在下面讲投票者的时候再说)



Java代码
01.<bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">  
02.        <property name="allowIfAllAbstainDecisions"><!-- 是否让全部弃权的通过 -->  
03.            <value>false</value>  
04.        </property>  
05.        <property name="decisionVoters"><!-- 投票者们 -->  
06.            <ref bean="roleVoter"/>  
07.        </property>  
08.    </bean> 



view plaincopy to clipboardprint?
01.<bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased"> 
02.        <property name="allowIfAllAbstainDecisions"><!-- 是否让全部弃权的通过 --> 
03.            <value>false</value> 
04.        </property> 
05.        <property name="decisionVoters"><!-- 投票者们 --> 
06.            <ref bean="roleVoter"/> 
07.        </property> 
08.    </bean> 

而投票者呢:Acegi自己实现了一个投票者的类RoleVoter:
现在我用第一种方案,RoleVoter只是在URL对应的用户组里有ROLE_为前缀的才进行投票,否则的话弃权.(我们也可以在配置RoleVoter的时候把ROLE_配置成为别的前缀如JAVA_),分别对URL对应的每个用户组投票,如果用户在这个用户组里就投赞成,不在投反对(在用户组的前缀是ROLE_的前提下)这样就不难体会第三种方案的用途了吧



Java代码
01.<bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter">  
02.        <property name="rolePrefix">  
03.            <value>ROLE_</value><!-- 可以改成别的 -->  
04.        </property>  
05.    </bean> 



view plaincopy to clipboardprint?
01.<bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter"> 
02.        <property name="rolePrefix"> 
03.            <value>ROLE_</value><!-- 可以改成别的 --> 
04.        </property> 
05.    </bean> 

这样认证管理器和授权管理器就ok了,别的无论是过滤器还是拦截器都会用到它们两个,因为它们都要验证而这两个就是凭证.
那么那两个访问过滤器呢,先说authenticationProcessingFilter是用于表单登陆的



Java代码
01.<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">  
02.        <property name="authenticationManager"><ref bean="authenticationManager"/></property>  
03.        <property name="authenticationFailureUrl"><value>/failure.html</value></property><!--登陆失败转向的页面  -->  
04.        <property name="defaultTargetUrl"><value>/ok.html</value></property><!-- 登陆成功转向的页面 -->  
05.        <property name="filterProcessesUrl"><value>/check</value></property><!-- 要验证的地址 -->  
06.    </bean> 



view plaincopy to clipboardprint?
01.<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"> 
02.        <property name="authenticationManager"><ref bean="authenticationManager"/></property> 
03.        <property name="authenticationFailureUrl"><value>/failure.html</value></property><!--登陆失败转向的页面  --> 
04.        <property name="defaultTargetUrl"><value>/ok.html</value></property><!-- 登陆成功转向的页面 --> 
05.        <property name="filterProcessesUrl"><value>/check</value></property><!-- 要验证的地址 --> 
06.    </bean> 

这样的话加上上面配置的认证管理器就已经可以处理登陆了(注意的是它没有用到授权管理器,因为它只是个访问入口还没有权限的授予)
再说一下HTTP基本认证:它比上面的略复杂一点
需要配置一个



Java代码
01.<bean id="BasicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">  
02.        <property name="realmName"><value>javafish</value></property><!-- 基本认证对话框上显示的字 -->  
03.    </bean>  
04.然后  
05.<bean id="BasicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">  
06.        <property name="authenticationManager">  
07.            <ref bean="authenticationManager"/>  
08.        </property>  
09.        <property name="authenticationEntryPoint">  
10.            <ref bean="BasicProcessingFilterEntryPoint"/>  
11.        </property>  
12.    </bean> 



view plaincopy to clipboardprint?
01.<bean id="BasicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint"> 
02.        <property name="realmName"><value>javafish</value></property><!-- 基本认证对话框上显示的字 --> 
03.    </bean> 
04.然后 
05.<bean id="BasicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter"> 
06.        <property name="authenticationManager"> 
07.            <ref bean="authenticationManager"/> 
08.        </property> 
09.        <property name="authenticationEntryPoint"> 
10.            <ref bean="BasicProcessingFilterEntryPoint"/> 
11.        </property> 
12.    </bean> 

即可.
不过在HTTP基本认证里需要注意的地方是:好多人配置好了怎么看不到效果啊,一开始我也是很郁闷,看了BasicProcessingFilter的源代码:
String header = httpRequest.getHeader("Authorization");//我们一般进入网页测试的时候这里的header始终是null的



Java代码
01.if (logger.isDebugEnabled()) {  
02.            logger.debug("Authorization header: " + header);  
03.        }  
04.        if ((header != null) && header.startsWith("Basic ")) {//从这里可以看到一般的登陆基本认证是不起作用的  
05.................. 



view plaincopy to clipboardprint?
01.if (logger.isDebugEnabled()) { 
02.            logger.debug("Authorization header: " + header); 
03.        } 
04.        if ((header != null) && header.startsWith("Basic ")) {//从这里可以看到一般的登陆基本认证是不起作用的 
05.................. 

只有在服务器上配置哪个目录在访问的时候用HTTP基本认证,它才会起作用(一开始还以为是Acegi的BUG呢)
下面说一下真正对URL资源的保护了filterSecurityInterceptor它的本质是个过滤器,有了前面*管理器的基础了这就很容易了:



Java代码
01.<bean id="filterSecurityInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">  
02.        <property name="authenticationManager">  
03.            <ref local="authenticationManager"/>  
04.        </property>  
05.        <property name="accessDecisionManager">  
06.            <ref local="accessDecisionManager"/>  
07.        </property>  
08.        <property name="objectDefinitionSource"><!-- 把URL和可访问的用户组对应起来 -->  
09.            <value>  
10.                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<!-- 把URL全部转化为小写 -->  
11.                PATTERN_TYPE_APACHE_ANT<!-- 以ANT的形式来配置路径 -->  
12.                /ok.html=ROLE_USER  
13.            </value>  
14.        </property>  
15.    </bean> 



view plaincopy to clipboardprint?
01.<bean id="filterSecurityInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"> 
02.        <property name="authenticationManager"> 
03.            <ref local="authenticationManager"/> 
04.        </property> 
05.        <property name="accessDecisionManager"> 
06.            <ref local="accessDecisionManager"/> 
07.        </property> 
08.        <property name="objectDefinitionSource"><!-- 把URL和可访问的用户组对应起来 --> 
09.            <value> 
10.                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<!-- 把URL全部转化为小写 --> 
11.                PATTERN_TYPE_APACHE_ANT<!-- 以ANT的形式来配置路径 --> 
12.                /ok.html=ROLE_USER 
13.            </value> 
14.        </property> 
15.    </bean> 

光这样配置还是不够的,因为当授权失败的时候会抛出异常的,我们应该配置一个异常过滤器来捕获它,exceptionTranslationFilter它是用来捕获异常的,看一下配置吧:



Java代码
01.<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">  
02.      <property name="authenticationEntryPoint"><ref local="authenticationProcessingFilterEntryPoint"/></property>  
03.      <property name="accessDeniedHandler">  
04.        <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">  
05.            <property name="errorPage" value="/failure.html"/><!-- 发生异常转向的网页 -->  
06.        </bean>  
07.      </property>  
08.   </bean>  
09.   <bean id="authenticationProcessingFilterEntryPoint" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">  
10.        <property name="loginFormUrl"><value>/Login.html</value></property><!-- 得到表单的信息 -->  
11.        <property name="forceHttps"><value>false</value></property><!-- 不用https -->  
12.   </bean> 



view plaincopy to clipboardprint?
01.<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"> 
02.      <property name="authenticationEntryPoint"><ref local="authenticationProcessingFilterEntryPoint"/></property> 
03.      <property name="accessDeniedHandler"> 
04.        <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl"> 
05.            <property name="errorPage" value="/failure.html"/><!-- 发生异常转向的网页 --> 
06.        </bean> 
07.      </property> 
08.   </bean> 
09.   <bean id="authenticationProcessingFilterEntryPoint" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"> 
10.        <property name="loginFormUrl"><value>/Login.html</value></property><!-- 得到表单的信息 --> 
11.        <property name="forceHttps"><value>false</value></property><!-- 不用https --> 
12.   </bean> 

这样就OK了
最后说一下对类中方法的保护:
首先写一个类并在spring中配置好:



Java代码
01.package org.li.acegi;  
02. 
03.public class TestAcegi  
04.{  
05.    public void Role()  
06.    {  
07.        System.out.println("javafish");  
08.    }  
09.}  
10.<bean id="testAcegi" class="org.li.acegi.TestAcegi"/> 



view plaincopy to clipboardprint?
01.package org.li.acegi; 
02. 
03.public class TestAcegi 
04.{ 
05.    public void Role() 
06.    { 
07.        System.out.println("javafish"); 
08.    } 
09.} 
10.<bean id="testAcegi" class="org.li.acegi.TestAcegi"/> 

然看写个servlet访问一下它



Java代码
01.package org.li.servlet;  
02. 
03.import java.io.IOException;  
04.import java.io.PrintWriter;  
05. 
06.import javax.servlet.ServletException;  
07.import javax.servlet.http.HttpServlet;  
08.import javax.servlet.http.HttpServletRequest;  
09.import javax.servlet.http.HttpServletResponse;  
10. 
11.import org.li.acegi.TestAcegi;  
12.import org.springframework.context.ApplicationContext;  
13.import org.springframework.web.context.support.WebApplicationContextUtils;  
14. 
15.public class TestServlet extends HttpServlet  
16.{  
17.    private static final long serialVersionUID = -5610016980827214773L;  
18. 
19.    public void doGet(HttpServletRequest request, HttpServletResponse response)  
20.            throws ServletException, IOException  
21.    {  
22.        response.setContentType("text/html;charset=GBK");  
23.        PrintWriter out = response.getWriter();  
24.        ApplicationContext ctx =   
25.            WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());  
26.        TestAcegi test = (TestAcegi)ctx.getBean("testAcegi");  
27.        test.Role();//访问TestAcegi类的Role方法  
28.        out.println("调用成功");  
29.    }  
30. 
31.    public void doPost(HttpServletRequest request, HttpServletResponse response)  
32.            throws ServletException, IOException  
33.    {  
34.        doGet(request,response);  
35.    }  
36. 
37.} 



view plaincopy to clipboardprint?
01.package org.li.servlet; 
02. 
03.import java.io.IOException; 
04.import java.io.PrintWriter; 
05. 
06.import javax.servlet.ServletException; 
07.import javax.servlet.http.HttpServlet; 
08.import javax.servlet.http.HttpServletRequest; 
09.import javax.servlet.http.HttpServletResponse; 
10. 
11.import org.li.acegi.TestAcegi; 
12.import org.springframework.context.ApplicationContext; 
13.import org.springframework.web.context.support.WebApplicationContextUtils; 
14. 
15.public class TestServlet extends HttpServlet 
16.{ 
17.    private static final long serialVersionUID = -5610016980827214773L; 
18. 
19.    public void doGet(HttpServletRequest request, HttpServletResponse response) 
20.            throws ServletException, IOException 
21.    { 
22.        response.setContentType("text/html;charset=GBK"); 
23.        PrintWriter out = response.getWriter(); 
24.        ApplicationContext ctx =  
25.            WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext()); 
26.        TestAcegi test = (TestAcegi)ctx.getBean("testAcegi"); 
27.        test.Role();//访问TestAcegi类的Role方法 
28.        out.println("调用成功"); 
29.    } 
30. 
31.    public void doPost(HttpServletRequest request, HttpServletResponse response) 
32.            throws ServletException, IOException 
33.    { 
34.        doGet(request,response); 
35.    } 
36. 
37.} 

准备工作做好了,开始配置Acegi
先在Spring里给Acegi做个代理:



Java代码
01.<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
02.        <property name="beanNames">  
03.            <list>  
04.                <value>testAcegi</value><!-- 要代理的Bean的id -->  
05.            </list>  
06.        </property>  
07.        <property name="interceptorNames">  
08.            <list>  
09.                <value>methodSecurityInterceptor</value><!-- 代理为... -->  
10.            </list>  
11.        </property>  
12.    </bean> 



view plaincopy to clipboardprint?
01.<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
02.        <property name="beanNames"> 
03.            <list> 
04.                <value>testAcegi</value><!-- 要代理的Bean的id --> 
05.            </list> 
06.        </property> 
07.        <property name="interceptorNames"> 
08.            <list> 
09.                <value>methodSecurityInterceptor</value><!-- 代理为... --> 
10.            </list> 
11.        </property> 
12.    </bean> 

里面的methodSecurityInterceptor呢配置为:



Java代码
01.<bean id="methodSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">  
02.        <property name="authenticationManager">  
03.            <ref bean="authenticationManager"/>  
04.        </property>  
05.        <property name="accessDecisionManager">  
06.            <ref bean="accessDecisionManager"/>  
07.        </property>  
08.        <property name="objectDefinitionSource"><!-- 对代理的类的方法开始配置权限 -->  
09.            <value>org.li.acegi.TestAcegi.Role=ROLE_USER</value>  
10.        </property>  
11.    </bean> 



view plaincopy to clipboardprint?
01.<bean id="methodSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor"> 
02.        <property name="authenticationManager"> 
03.            <ref bean="authenticationManager"/> 
04.        </property> 
05.        <property name="accessDecisionManager"> 
06.            <ref bean="accessDecisionManager"/> 
07.        </property> 
08.        <property name="objectDefinitionSource"><!-- 对代理的类的方法开始配置权限 --> 
09.            <value>org.li.acegi.TestAcegi.Role=ROLE_USER</value> 
10.        </property> 
11.    </bean> 

这样当直接访问http://localhost:8080/AcegiWeb/servlet/TestServlet的时候会发现不可访问,控件台也不输出”javafish”,当输入正确的用户名和密码之后便可以访问.
这样它就对类的方法调用起了保护的作用,这一点可以把Acegi应用到DWR上效果是很理想的.
对于Acegi有很多的过滤器不用全写在web.xml里,acegi提供了一个特殊的过滤器我们可以写成这样,在Web.xml里:



Java代码
01.<filter>  
02.        <filter-name>Acegi</filter-name>  
03.        <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>  
04.        <init-param>  
05.            <param-name>targetClass</param-name>  
06.            <param-value>org.acegisecurity.util.FilterChainProxy</param-value>  
07.        </init-param>  
08.    </filter>  
09.    <filter-mapping>  
10.        <filter-name>Acegi</filter-name>  
11.        <url-pattern>/*</url-pattern>  
12.    </filter-mapping>  
13.    <context-param>  
14.        <param-name>contextConfigLocation</param-name>  
15.        <param-value>  
16.            /WEB-INF/applicationContext.xml  
17.        </param-value>  
18.    </context-param>  
19.    <listener>  
20.        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
21.    </listener>  
22.      
23.    <listener>  
24.        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
25.    </listener>  
26.    <listener>  
27.        <listener-class>org.acegisecurity.ui.session.HttpSessionEventPublisher</listener-class>  
28.    </listener>  
29.  <servlet>  
30.    <servlet-name>TestServlet</servlet-name>  
31.    <servlet-class>org.li.servlet.TestServlet</servlet-class>  
32.  </servlet>  
33. 
34.  <servlet-mapping>  
35.    <servlet-name>TestServlet</servlet-name>  
36.    <url-pattern>/servlet/TestServlet</url-pattern>  
37.  </servlet-mapping> 



view plaincopy to clipboardprint?
01.<filter> 
02.        <filter-name>Acegi</filter-name> 
03.        <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class> 
04.        <init-param> 
05.            <param-name>targetClass</param-name> 
06.            <param-value>org.acegisecurity.util.FilterChainProxy</param-value> 
07.        </init-param> 
08.    </filter> 
09.    <filter-mapping> 
10.        <filter-name>Acegi</filter-name> 
11.        <url-pattern>/*</url-pattern> 
12.    </filter-mapping> 
13.    <context-param> 
14.        <param-name>contextConfigLocation</param-name> 
15.        <param-value> 
16.            /WEB-INF/applicationContext.xml 
17.        </param-value> 
18.    </context-param> 
19.    <listener> 
20.        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
21.    </listener> 
22.     
23.    <listener> 
24.        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
25.    </listener> 
26.    <listener> 
27.        <listener-class>org.acegisecurity.ui.session.HttpSessionEventPublisher</listener-class> 
28.    </listener> 
29.  <servlet> 
30.    <servlet-name>TestServlet</servlet-name> 
31.    <servlet-class>org.li.servlet.TestServlet</servlet-class> 
32.  </servlet> 
33. 
34.  <servlet-mapping> 
35.    <servlet-name>TestServlet</servlet-name> 
36.    <url-pattern>/servlet/TestServlet</url-pattern> 
37.  </servlet-mapping> 

在Spring的配置文件里:



Java代码
01.<bean id="chainProxy" class="org.acegisecurity.util.FilterChainProxy">  
02.        <property name="filterInvocationDefinitionSource">  
03.            <value>  
04.                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON  
05.            PATTERN_TYPE_APACHE_ANT  
06.            /**=HttpSessionContextIntegrationFilter,authenticationProcessingFilter,BasicProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor  
07.            </value>  
08.        </property>  
09.    </bean> 
  
分享到:

分享到:
评论

相关推荐

    spring acegi 详细文档

    如果你手头有Acegi的详细文档,如acegi.docx和Acegi.zip中的内容,这将是一个宝贵的资源,帮助你深入理解和解决问题。 总结起来,Spring Acegi是一个强大的安全框架,它的功能包括用户认证、权限控制和安全拦截。...

    Spring acegi 3 文档

    文档通常会涵盖安装指南、配置示例、API 参考等内容,对于学习和使用 Spring Acegi 3 极为重要。其中的 `5ymb.com.txt` 文件可能是文档的一部分,而 `无忧模板_5ymb.com_论坛模板,网站模板免费下载.url` 看起来是一...

    acegi安全策略与CAS整合

    文档覆盖了从基础配置到高级定制的所有阶段,并适用于对AceGI和CAS有一定了解的技术人员。 0.1 文档目的: 文档的目的是确保用户能够成功地将AceGI安全框架集成到他们的应用程序中,利用CAS服务器进行单点登录(SSO...

    学习Acegi-认证 文档

    通过本文的介绍,读者可以了解到Acegi认证服务的基本原理、配置方法以及核心组件。此外,通过示例代码的解析,还可以帮助开发者快速上手Acegi认证的实践应用。希望本文能够为正在学习或使用Acegi的同学提供有价值的...

    acegi pdf 学习

    综上所述,通过这份文档,读者能够全面了解Acegi安全系统的基础知识和高级特性,特别是如何在Spring应用程序中实现和配置不同类型的认证机制。这对于希望在Web应用程序中实施安全控制的开发人员来说,是一份宝贵的...

    spring的acegi应用

    通常,这种文档会包含实际的代码示例、配置说明以及可能出现的问题和解决方案。由于无法直接查看文档内容,建议下载并阅读这份文档以获取更深入的理解。 总之,Spring Security(前身Acegi Security)是Spring框架...

    acegi_help.zip_Help!_acegi

    "acegi.pdf"可能是Acegi官方文档或者详细教程,包含了更全面的技术细节,包括如何配置安全拦截器,处理会话管理,以及与其他Spring模块的集成等。 "www.pudn.com.txt"可能是一个链接或者引用来源,通常这样的文本...

    acegi-security-resin-0.8.3.jar.zip

    1. **理解Acegi Security配置**:阅读官方文档,了解如何在Spring配置文件中声明Acegi Security组件,如FilterChainProxy、AuthenticationProvider等。 2. **设置Resin服务器**:根据Acegi的指导配置Resin服务器,...

    Acegi_db1.rar_acegi

    Acegi_db1.rar_acegi 是一个与Acegi安全框架相关的压缩包,它可能包含了用于数据库配置和安全策略实现的源代码以及相关的说明文档。Acegi是Spring Security的前身,是一个非常重要的Java安全框架,主要用于企业级...

    acegi资料大全-全集

    `浅谈Acegi配置.mht`系列文件可能探讨了Acegi的配置过程,包括基本的配置元素如`&lt;security:global-method-security&gt;`和`&lt;security:http&gt;`,以及如何定义权限表达式和自定义过滤器。Acegi的配置是其强大之处,但也...

    acegi 完整实例

    文档`acegi.doc`很可能包含了关于如何配置和使用这些功能的详细步骤,而`SSH.rar`可能包含了一个演示如何集成Acegi到SSH(Spring、Struts和Hibernate)应用程序的示例项目。 了解和掌握Acegi Security的这些核心...

    Spring ACEGI手册(部份)

    在阅读《Spring ACEGI手册(部分)》.doc文档时,可以深入学习如何配置和使用该框架,以及如何解决常见的安全问题。 **总结** Spring ACEGI作为一个强大的安全框架,为开发者提供了丰富的工具和机制来保护应用程序...

    使用Acegi作为基于Spring框架的WEB应用的安全框架

    "实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf"这份文档详细讲解了如何在实际项目中部署和使用Acegi Security。内容可能包括: - 安装和设置Acegi Security库。 - 创建自定义认证和授权逻辑。 - ...

    acegi帮助资料

    开发者可以通过这份指南学习如何编写自定义的安全组件,以及如何调试和优化Acegi配置。 《Acegi-springsecurity1.0.7.pdf》可能是Spring Security的早期版本文档,因为Spring Security是从Acegi发展而来。这份文档...

    Acegi

    描述:Acegi是官方学习文档,提供全面的Acegi安全系统指南,当官方网络缓慢或无法访问时,这份文档成为学习和理解Acegi的关键资源。 Acegi安全系统是一款专为Spring框架设计的安全管理工具,旨在为Java应用提供强大...

    grails-acegi-0.5.zip

    2. `application.properties`:这个文件用于存储应用的属性,可以包含Grails Acegi插件的配置参数,如用户的认证方式、权限设置等。 3. `plugin.xml`:XML格式的插件配置文件,通常包含插件的版本、作者等信息,有时...

    Acegi解决权限问题

    在本文中,我们将深入探讨Acegi如何解决权限问题,并通过分析提供的代码、文档和配置文件,来理解其实现机制。 首先,Acegi的核心功能是提供细粒度的访问控制,允许开发者对应用中的资源(如URL、方法、对象等)...

    acegi-sample.rar_acegi-1.0.7_acegi-sample.part2_spring-1.2.4.jar

    在"www.pudn.com.txt"文件中,可能包含了有关Acegi Security的教程、文档链接或其他相关资源。而"acegi-sample"目录下的文件则可能包括了示例代码、配置文件等,帮助开发者快速上手和理解Acegi Security的工作原理。...

    菜鸟-手把手教你把Acegi应用到实际项目中

    Acegi 是一个早期的安全框架,用于Java Spring应用中的身份验证和授权管理。这个框架使得开发者能够轻松地...在学习过程中,不断实践和调试是掌握Acegi的关键,同时参考官方文档和其他开发者的经验分享也会非常有帮助。

    基于spring的Acegi安全框架认证与授权的分析及扩展.pdf

    ### 基于Spring的Acegi安全框架认证与授权的分析及扩展 #### 1. Acegi安全框架的概述 Acegi(后更名为Spring ...通过本文档的介绍,希望能帮助读者更好地理解和运用Acegi安全框架,以构建更加健壮和安全的应用程序。

Global site tag (gtag.js) - Google Analytics