spring2.0 security与acegi的结合配置

一、web.xml的配置(摘自: http://blog.csdn.net/anyoneking/article/details/1748317)
(1)  FilterToBeanProxy
   Acegi通过实现了Filter接口的FilterToBeanProxy提供一种特殊的使用Servlet Filter的方式,它委托Spring 中的Bean -- FilterChainProxy来完成过滤功能,这好处是简化了web.xml的配置,并且充分利用了Spring IOC的优 势。FilterChainProxy包含了处理认证过程的filter列表,每个filter都有各自的功能。
 
   Spring Security Filter Chain Proxy
   org.acegisecurity.util.FilterToBeanProxy
   
    targetClass
    org.acegisecurity.util.FilterChainProxy
   

 

(2) filter-mapping
  限定了FilterToBeanProxy的URL匹配模式,现在用/匹配所有URL。
  
   Spring Security Filter Chain Proxy
   /*
 

(3) HttpSessionEventPublisher
 ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。
 HttpSessionEventPublisher用于发布 HttpSessionApplicationEvents和HttpSessionDestroyedEvent事件给spring的 applicationcontext。
 
   org.springframework.web.context.ContextLoaderListener   
 

 
   org.acegisecurity.ui.session.HttpSessionEventPublisher
 

二、过滤器的配置(参考自 http://eryk.iteye.com/blog/626651  spring security 11种过滤器介绍 )
1、channelProcessingFilter
 请求通过ChannelProcessingFilter(通道处理过滤器,可选)。该过滤器负责检查当前请求的Channel,并判断是否已满足安全需要。如果不满足,则由非安全的通道传输(Http)重定向于安全的通道传输(Https),以确保服务器与浏览器之间传输的数据加密。
  (1)、在filterChainProxy里面加上channelProcessingFilter
 
  
   
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    PATTERN_TYPE_APACHE_ANT   /**=channelProcessingFilter,concurrentSessionFilter,httpSessionIntegrationFilter,logoutFilter,authenticationProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor
   

  

 

  (2)、配置channelProcessingFilter
 
 
  
   
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    PATTERN_TYPE_APACHE_ANT
    /login.jsp=REQUIRES_INSECURE_CHANNEL
    /j_acegi_security_check*=REQUIRES_INSECURE_CHANNEL
    /**=REQUIRES_INSECURE_CHANNEL
   

  

  
 

 
 
  
   
    
    
   

  

 

2、concurrentSessionFilter
 concurrentSessionFilter用于限制用户重复登录。
 (1)、在filterChainProxy里面加上concurrentSessionFilter
 (2)、配置concurrentSessionFilter
 
     
     
 

 
  (3)、配置concurrentSessionController,阻止用户在进行了一次成功登录以后再进行一次成功的登录,maximumSessions属性配置了只允许同一个用户登录系统一次,exceptionIfMaximumExceeded属性配    置了在进行第二次登录时是否让第一次登录失效。设置为true不允许第二次登录,设置为false表示第二次登录成功的同时让第一次登录失效:
 
   
   
   
 

  (4)、配置concurrentSessionController,并在authenticationManager里面配置了一个名为sessionController的Bean,即对concurrentSessionController的引用:
 
 
      ...
     
       
     

 

3、HttpSessionContextIntegrationFilter
 用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个SecurityContext了。如果存在,就把SecurityContext拿出来,放到SecurityContextHolder中,供Spring Security的其他部分使用。如果不存在,就创建一个SecurityContext出来,还是放到SecurityContextHolder中,供Spring Security的其他部分使用。
 用途二,在所有过滤器执行完毕后,清空SecurityContextHolder,因为SecurityContextHolder是基于ThreadLocal的,如果在操作完成后清空ThreadLocal,会受到服务器的线程池机制的影响。
 (1)、在filterChainProxy里面加上HttpSessionContextIntegrationFilter
 (2)、配置HttpSessionContextIntegrationFilter
  
   
4、logoutFilter
 只处理注销请求,默认为/j_spring_security_logout。
 用途是在用户发送注销请求时,销毁用户session,清空SecurityContextHolder,然后重定向到注销成功页面。可以与rememberMe之类的机制结合,在注销的同时清空用户cookie。
 (1)、在filterChainProxy里面加上logoutFilter
 (2)、配置logoutFilter
 
  
     
     
       
         
        

     

   

5、authenticationProcessingFilter
 处理form登陆的过滤器,与form登陆有关的所有操作都是在此进行的。
 默认情况下只处理/j_spring_security_check请求,这个请求应该是用户使用form登陆后的提交地址,form所需的其他参数可以参考:
 此过滤器执行的基本操作时,通过用户名和密码判断用户是否有效,如果登录成功就跳转到成功页面(可能是登陆之前访问的受保护页面,也可能是默认的成功页面),如果登录失败,就跳转到失败页面。
 (1)、配置前端页面
 

 

    登陆
    用户:

    密码:

    两周之内不必登陆

   
   
 

 

 /j_spring_security_check,提交登陆信息的URL地址。
 自定义form时,要把form的action设置为/j_spring_security_check。注意这里要使用绝对路径,避免登陆页面存放的页面可能带来的问题。
 j_username,输入登陆名的参数名称。
 j_password,输入密码的参数名称
  _spring_security_remember_me,选择是否允许自动登录的参数名称,可以直接把这个参数设置为一个checkbox,无需设置value,Spring Security会自行判断它是否被选中,与rememberMe机制结合使用。
  (2)、在filterChainProxy里面加上authenticationProcessingFilter
  (3)、配置authenticationProcessingFilter
  
 
  
  
  
  
 

  (4)、配置认证管理器authenticationManager
 
 
  
   
    
   

  

 

 (5)、配置认证提供者authenticationProvider
 
  
  
   
  

  
  
   
    
   

  

  
   
    
   

  

 

 
  
  
 

 
  
 

 
 
  
  
   
    SELECT email as username,password,'1' as enabled
    FROM Motorist
    WHERE email = ?
   

  

  
   
    SELECT email as username,privilege as authority
      FROM Motorist_privileges mp,Motorist m
      WHERE mp.motorist_id=m.id AND m.email=?
   

  

 

6、rememberMeProcessingFilter
 此过滤器实现RememberMe功能,当用户cookie中存在rememberMe的标记,此过滤器会根据标记自动实现用户登陆,并创建SecurityContext,授予对应的权限。
 实际上,Spring Security中的rememberMe是依赖cookie实现的,当用户在登录时选择使用rememberMe,系统就会在登录成功后将为用户生成一个唯一标识,并将这个标识保存进cookie中,我们可以通过浏览器查看用户电脑中的cookie。
 (1)、配置rememberMeProcessingFilter
 
       class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
  
  
 

 
         class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
  
  
  
 

 
 
  
 

 (2)、不要忘记把你的RememberMeServices实现添加到AuthenticationProcessingFilter.setRememberMeServices()属性中,包括把RememberMeAuthenticationProvider添加到你的AuthenticationManager.setProviders()队列中,把RememberMeProcessingFilter添加到你的FilterChainProxy中(要放到AuthenticationProcessingFilter后面),并且在httpSessionIntegrationFilter中配置forceEagerSessionCreation=true,如果退出时想取消自动登录功能,需要在退出过滤器logoutFilter中配置rememberMeServices。
 
 
  
  
  
  
  
 

 
 
  
   
    
    
   

  

  
 

 
 
  
  
   true
  

 

 
 
   
   
     
      
       
       
      

   

 

7、anonymousProcessingFilter
 为了保证操作统一性,当用户没有登陆时,默认为用户分配匿名用户的权限。
 (1)、配置anonymousProcessingFilter
 
 
  
  
 

 
  
 

 (2)把anonymousAuthenticationProvider添加到你的AuthenticationManager.setProviders()队列中
 
 
  
   
    
    
    
   

  

  
 

8、exceptionTranslationFilter
 此过滤器的作用是处理中FilterSecurityInterceptor抛出的异常,然后将请求重定向到对应页面,或返回对应的响应错误代码。
 (1)、配置exceptionTranslationFilter
 
 
  
  
 

 
 
  
 

 
 
   
  
 

9、FilterSecurityInterceptor
 用户的权限控制都包含在这个过滤器中。
 功能一:如果用户尚未登陆,则抛出AuthenticationCredentialsNotFoundException“尚未认证异常”。
 功能二:如果用户已登录,但是没有访问当前资源的权限,则抛出AccessDeniedException“拒绝访问异常”。
 功能三:如果用户已登录,也具有访问当前资源的权限,则放行。
 (1)、配置exceptionTranslationFilter
 
  
  
  
   
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    PATTERN_TYPE_APACHE_ANT
    /admin.jsp=GROUP_MOTORIST
    /user.jsp=GROUP_ANONYMOUS
   

  

 

 
 
  
   
    
   

  

  
 

 
  
  

 

你可能感兴趣的:(spring)