2010-08-26 3 views
11

Ich muss zwei benutzerdefinierte Filter für FORM_LOGIN_FILTER, z.Wie fügt man mehrere benutzerdefinierte Filter in Spring Security 3 hinzu?

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

Was ich die Filtersequenzen erwarten ist:
1. Predefind FORM_LOGIN_FILTER
2. myUsernamePasswordAuthenticationFilter
3. myUsernamePasswordAuthenticationFilter2

aber oben wird Konfigurationsfehler verursachen. Also weiß jemand, wie man die richtige Konfiguration schreibt? Danke!

Antwort

5

tun:

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

, die sie setzen sollten, wo Sie wollen.

+1

Vielen Dank! Dies könnte eine nette Lösung sein. Aber was, wenn ich zwei hinzufügen möchte zwei oder mehr benutzerdefinierte Filter zwischen FORM_LOGIN_FILTER und BASIC_AUTH_FILTER? Gibt es eine Lösung? Danke nochmal. – Paganini

+0

Fühlen Sie sich frei, es dann zu upvote;) – Gandalf

0

ich es wie folgt gelöst:

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); 
    } 

} 

dann im XML-Kontext i haben:

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

Verwenden Spring CompositeFilter Ihre benutzerdefinierten Filterliste zu wickeln, und setzen Sie dann die Filter auf relevante Position auf SecurityFilterChain.

z. wie folgt:

<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

Froh, es gibt eine Lösung für diese, aber wäre schön, Bean Refs anstelle von Enum-Werte für vorher/nachher Attribute –

+2

Dies ist die richtige Antwort auf die Frage und sollte die gewählte . Vielen Dank! – monzonj

+0

Richtige Antwort, Die Filterbeans können auch mit dem Request-Matcher-Muster konfiguriert werden – webjockey