2010-08-26 17 views
11

Necesito agregar dos filtros personalizados para FORM_LOGIN_FILTER, p.¿Cómo agregar múltiples filtros personalizados en Spring Security 3?

<custom-filter after="FORM_LOGIN_FILTER" ref="myUsernamePasswordAuthenticationFilter" /> 
<custom-filter after="FORM_LOGIN_FILTER" ref="myUsernamePasswordAuthenticationFilter2" /> 

Lo que espero las secuencias de filtro es:
1. Predefind FORM_LOGIN_FILTER
2. myUsernamePasswordAuthenticationFilter
3. myUsernamePasswordAuthenticationFilter2

Pero sobre provocará error de configuración. Entonces, ¿alguien sabe cómo escribir la configuración correcta? Gracias!

Respuesta

5

hacer esto:

<custom-filter after="FORM_LOGIN_FILTER" ref="myUsernamePasswordAuthenticationFilter" /> 
<custom-filter before="BASIC_AUTH_FILTER" ref="myUsernamePasswordAuthenticationFilter2" /> 

Eso debería ponerlos donde quieras.

+1

¡Muchas gracias! Esta podría ser una buena solución. Pero, ¿y si quiero dos, agregar dos o más filtros personalizados entre FORM_LOGIN_FILTER y BASIC_AUTH_FILTER? ¿Hay alguna solución provista? Gracias de nuevo. – Paganini

+0

Siéntete libre de subirlo de opinión entonces;) – Gandalf

0

Lo resuelto de esta manera:

public class QmLoginFilterWrapper extends GenericFilterBean implements ApplicationEventPublisherAware, 
    MessageSourceAware 
{ 
    private static final Logger       LOGGER  = LoggerFactory.getLogger(QmLoginFilterWrapper.class); 

    private List<AbstractAuthenticationProcessingFilter> filterList = new ArrayList<AbstractAuthenticationProcessingFilter>(); 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, final FilterChain chain) throws IOException, 
     ServletException 
    { 
    FilterChain filterChain = new FilterChain() { 

     @Override 
     public void doFilter(ServletRequest arg0, ServletResponse arg1) throws IOException, ServletException 
     { 
     chain.doFilter(arg0, arg1); 

     } 
    }; 
    Vector<FilterChain> filterChains = new Vector<FilterChain>(); 
    filterChains.add(filterChain); 
    if (LOGGER.isDebugEnabled()) 
    { 
     LOGGER.debug("Filtering {} filters", filterList.size()); 
    } 
    for (final GenericFilterBean filter : filterList) 
    { 
     final FilterChain lastChain = filterChains.lastElement(); 
     FilterChain loopChain = new FilterChain() { 

     @Override 
     public void doFilter(ServletRequest arg0, ServletResponse arg1) throws IOException, ServletException 
     { 
      if (LOGGER.isDebugEnabled()) 
      { 
      LOGGER.debug("running filter {}", filter.getClass().getName()); 
      } 
      filter.doFilter(arg0, arg1, lastChain); 
     } 
     }; 
     filterChains.add(loopChain); 
    } 
    filterChains.lastElement().doFilter(request, response); 
    } 

    @Override 
    public void setMessageSource(MessageSource messageSource) 
    { 
    for (MessageSourceAware filter : filterList) 
    { 
     filter.setMessageSource(messageSource); 
    } 
    } 

    @Override 
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) 
    { 
    for (ApplicationEventPublisherAware applicationEventPublisherAware : filterList) 
    { 
     applicationEventPublisherAware.setApplicationEventPublisher(applicationEventPublisher); 
    } 
    } 

    public List<AbstractAuthenticationProcessingFilter> getFilterList() 
    { 
    return filterList; 
    } 

    public void setFilterList(List<AbstractAuthenticationProcessingFilter> filterList) 
    { 
    this.filterList = filterList; 
    Collections.reverse(this.filterList); 
    } 

} 

A continuación, en el XML de contexto tengo:

<bean id="qmAuthFilter" class="com.qmplus.common.logon.QmLoginFilterWrapper"> 
    <property name="filterList"> 
     <list> 
     <ref local="samlProcessingFilter" /> 
     <ref local="usernamePasswordAuthenticationFilter" /> 
     </list> 
    </property> 
    </bean> 
32

Uso de CompositeFilter primavera para envolver su lista de filtros personalizados, y luego poner ese filtro en posición relevante en SecurityFilterChain.

E.g. de esta manera:

<bean id="customFilters" class="org.springframework.web.filter.CompositeFilter"> 
    <property name="filters"> 
     <list> 
      <ref bean="myUsernamePasswordAuthenticationFilter"/> 
      <ref bean="myUsernamePasswordAuthenticationFilter2"/> 
     </list> 
    </property> 
</bean> 
... 
<custom-filter after="FORM_LOGIN_FILTER" ref="customFilters" /> 
+0

Me alegro de que haya una solución para esto, pero sería bueno permitir los refs de frijol en lugar de los valores de Enum para los atributos antes/después –

+2

Esta es la respuesta correcta a la pregunta y debe ser el elegido . ¡Gracias! – monzonj

+0

Respuesta correcta, los beans de filtro se pueden configurar también con el patrón Request Matcher – webjockey

Cuestiones relacionadas