- 浏览: 269550 次
- 性别:
- 来自: 新乡
文章分类
- 全部博客 (227)
- servciemix (10)
- db (18)
- javaTools (4)
- hibernate (31)
- web (3)
- spring (14)
- design pattern (4)
- java security (3)
- portal (1)
- ejb (6)
- session (2)
- java_lang (21)
- jbpm (29)
- struts (7)
- orgRights (2)
- project manager Jira (7)
- 跨库事务 (2)
- mysql (14)
- ubuntu (7)
- osgi (9)
- maven ant make (4)
- 分布式 高并发 高性能 (5)
- virgo-dm_server (0)
- osgi web (3)
- platform (1)
- smooks (1)
- business (1)
- 职场生涯 (14)
- Java编码格式 (2)
- web服务 (1)
- 计算机使用 (1)
- 健康工作生活的保障,工作中务必抛掉的不良心态 (4)
- 电信-网络监控 (1)
- 多线程-multithread (1)
- 海量数据-高性能 (2)
- Mybatis (1)
- web开发平台研发 (0)
- oracle (0)
- 应用服务器调优 (0)
- web前端 (0)
- servlet-jsp (0)
- tomcat (2)
- newtouch (1)
- portal_liferay (2)
- version control (1)
- apm-impact (2)
- tools (1)
- 研发管理 (1)
- 电商业务 (1)
- 生鲜电商市场调查 (0)
- PBX (0)
- 房东 (0)
最新评论
-
lifuchao:
...
权限问题 -
Branding:
谢谢,受教了,另外,CONN AS SYSDBA,必须是在操作 ...
Oracle密码忘记了怎么办? -
zhuchao_ko:
...
Portal实现原理 -
败类斯文:
不知道改哪里。。。木有见到红色。。表示悟性低了、、
jira error: Neither the JAVA_HOME nor the JRE_HOME environment variable is defin -
c__06:
正文:假如事务我是这样定义的: <tx:method n ...
Spring中Transactional配置
(转)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>
分享到:
相关推荐
U盘量产工具FLASH量产工具SM3280&3281&3282-AvidiaV0209整合版
java课程期末考试
分布式消息中间件,参考kafka,未完成
修木工施工规范及流程.docx
内容概要:本文详细介绍了VECTOR提供的MICROSAR OBD协议栈解决方案,涵盖了OBD模块、ECU支持、监控功能和服务请求等方面的内容。此外,还讨论了OBD在不同国家和地区的技术标准与法规要求,以及MICROSAR OBD解决方案的优势,如适应不同项目的需求和高度集成于AUTOSAR 4平台。 适合人群:汽车电子工程师、软件开发者、汽车制造商及相关行业从业人员。 使用场景及目标:① 适用于车辆诊断系统的开发和维护;②帮助工程师理解和掌握OBD协议的具体实施方法和应用场景;③ 提供了一个成熟、可扩展的解决方案,用于满足OBD相关标准和法规的要求。 其他说明:本文不仅提供了技术层面的详细解析,还探讨了实际操作过程中可能遇到的问题和解决方案。同时强调了屏蔽信息过载的重要性,提醒工程师保持内心平静,专注做好本职工作。
适用于 Python 的 LINE 消息 API SDK适用于 Python 的 LINE Messaging API 的 SDK。介绍适用于 Python 的 LINE Messaging API SDK 可以轻松使用 LINE Messaging API 开发机器人,您可以在几分钟内创建一个示例机器人。文档请参阅官方 API 文档了解更多信息英语https //developers.line.biz/en/docs/messaging-api/overview/日语https://developers.line.biz/ja/docs/messaging-api/overview/要求Python >= 3.9安装$ pip 安装 line-bot-sdk概要用法from flask import Flask, request, abortfrom linebot.v3 import ( WebhookHandler)from linebot.v3.exceptions import ( InvalidSig
Java字节码工程工具包Javassist 版本 3版权所有 (C) 1999-2023 Shigeru Chiba,保留所有权利。Javassist(JAVA 编程助手)使 Java 字节码操作变得简单。它是一个用于编辑 Java 字节码的类库它使 Java 程序能够在运行时定义新类并在 JVM 加载类文件时对其进行修改。与其他类似的字节码编辑器不同,Javassist 提供两个级别的 API源代码级别和字节码级别。如果用户使用源代码级别 API,他们可以编辑类文件而无需了解 Java 字节码的规范。整个 API 仅使用 Java 语言的词汇表进行设计。您甚至可以以源文本的形式指定插入的字节码Javassist 会即时编译它。另一方面,字节码级别 API 允许用户像其他编辑器一样直接编辑类文件。该软件根据 Mozilla 公共许可证版本 1.1、GNU 宽通用公共许可证版本 2.1 或更高版本或 Apache 许可证版本 2.0 分发。文件README.md 此自述文件。Changes.md 发行说明。License.html 许可证文件。tuto
本项目是基于Python语言开发的西西家居全屋定制系统,旨在为家居行业提供一个高效、智能的定制解决方案。项目涵盖了从客户需求分析、设计方案生成、材料选购到最终订单生成的全过程,力求实现家居定制的数字化和智能化。 在主要功能方面,系统具备强大的客户管理模块,能够详细记录和分析客户的定制需求。设计模块则采用先进的三维建模技术,为客户提供直观、真实的家居设计方案预览。此外,系统还整合了丰富的材料数据库,方便客户根据自身喜好和预算进行材料选择。 框架方面,项目采用了B/S架构,确保了系统的稳定性和可扩展性。后端使用Python的Django框架,前端则结合了HTML、CSS和JavaScript等技术,实现了用户界面的友好和响应速度。 开发此项目的目的,不仅是为了满足家居行业对个性化定制的需求,也为计算机相关专业的学生提供了一个实践和学习的平台,有助于提升他们的实际开发能力。
Javascript 是数字化创新的起点,是语言的基础,也是基本概念。Basecamp JavascriptJavascript 是数字化创新的起点,是语言的基础,也是基本概念。嵌套存储库,可作为启动项下待办事项的实践活动。
已弃用 — Coinbase Python APICoinbase Coinbase API V2的官方 Python 库。重要提示此库当前针对的是 API V2,而 OAuth 客户端需要 V2 权限(即wallet:accounts:read)。如果您仍在使用 API V1,请使用此库的旧版本。特征接近 100% 的测试覆盖率。支持API Key + Secret和OAuth 2身份验证。调用 API 的便捷方法 - 为您打包 JSON!自动将 API 响应解析为相关的 Python 对象。使用IPython时,所有对象都具有可制表完成的方法和属性。安装coinbase可以在PYPI上使用。使用以下命令安装pippip install coinbase或者easy_installeasy_install coinbase该库目前针对 Python 版本 2.7 和 3.4+ 进行了测试。注意此软件包名称过去是指George Sibble维护的非官方 coinbase_python 库。George 慷慨地允许我们使用此软件包
基于RBAC权限控制的基础后台
本项目是基于Python爬虫的网络小说数据分析系统的设计与实现,旨在为计算机相关专业的大学生提供一个实践平台,特别是在毕业设计和项目实战练习方面。项目通过Python强大的网络爬虫技术,从流行的网络小说网站自动抓取数据,包括书籍信息、章节内容、用户评论等。 主要功能涵盖数据采集、数据清洗、数据存储和数据分析。数据采集模块利用Scrapy等爬虫框架高效抓取网页内容;数据清洗模块确保数据的准确性和一致性;数据存储则采用MySQL等数据库系统,便于数据管理和查询;数据分析模块通过Pandas、NumPy等工具进行数据处理和分析,生成多维度的统计报告和可视化图表。 此项目不仅帮助学生掌握Python编程和网络爬虫技术,还能让他们深入了解数据分析的全过程,提升解决实际问题的能力。同时,系统的实现和应用也反映了现代信息技术在文学创作和消费领域的应用价值和潜力。
本项目是一个基于Java的在线日语培训平台的设计与实现,采用SSM框架(Spring+SpringMVC+MyBatis)进行开发,旨在为计算机相关专业的学生提供一个实践和学习的平台,同时也为日语学习者提供一个在线学习的空间。项目中主要功能涵盖了用户管理、课程管理、学习资源上传下载、在线测试与反馈等多个方面。通过该平台,教师能够轻松管理课程内容和学生信息,学生则可以随时随地访问学习资源,参与在线课程和测试,从而提高学习效率和兴趣。 在开发此项目的过程中,我们重点关注了系统的可维护性和可扩展性,确保代码结构清晰,便于后续的功能迭代和优化。此外,通过使用SSM框架,实现了前后端的分离,提高了开发效率和系统的响应速度。该项目不仅能够满足毕设的需求,还能作为Java学习者提升编程能力和实践经验的实用工具。
基于java的机票管理系统设计与实现.docx
该项目为《基于Java实现的数据结构设计源码》,共包含51个文件,主要由46个Java源文件构成,辅以2个文本文件、1个Git忽略文件、1个许可证文件以及1个XML文件,全面涵盖了数据结构设计的核心内容。
绿色食品 水稻生产操作规程.docx
他妈的 Fuck是一款出色的应用程序,其灵感来自@liamosaur 的 推文,它可以纠正以前控制台命令中的错误。The Fuck太慢了吗?试试实验性的即时模式!更多示例➜ apt-get install vimE: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?➜ fucksudo apt-get install vim [enter/↑/↓/ctrl+c][sudo] password for nvbn:Reading package lists... Done...➜ git pushfatal: The current branch master has no upstream branch.To push the current branch and set the remote
全国大学生FPGA创新设计竞赛作品 “泡罩包装药品质量在线检测平台“.zip
桃苗木质量基本要求表.docx
使用 Python 漂亮地打印表格数据,这是一个库和一个命令行实用程序。存储库从 bitbucket.org/astanin/python-tabulate 迁移而来。python-tabulate使用 Python、库和命令行实用程序漂亮地打印表格数据。该库的主要用例是轻松打印小表格只需一个函数调用,格式由数据本身引导为轻量级纯文本标记创作表格数据多种输出格式适合进一步编辑或转换混合文本和数字数据的可读表示智能列对齐、可配置数字格式、小数点对齐安装要安装 Python 库和命令行实用程序,请运行pip install tabulate命令行实用程序将在 Linux 上安装为(例如tabulate)或者在 Windows 上的 Python 安装中安装为(例如)。bin/usr/bintabulate.exeScriptsC:\Python39\Scripts\tabulate.exe您可以考虑仅为当前用户安装该库pip install tabulate --user在这种情况下,命令行实用程序将安装到 ~/.local/bin/tabula