2011-10-11 23 views
14

Ho implementato il mio LowerCaseUsernamePasswordAuthenticationFilter che è solo una sottoclasse di UsernamePasswordAuthenticationFilter.Configurare Spring Security per utilizzare UsernamePasswordAuthenticationFilter personalizzato

Ma ora il mio problema è, come configurare la sicurezza Spring per utilizzare questo filtro.

Fino ad ora ho usato:

<security:http auto-config="true" use-expressions="true"> 
    <security:form-login login-processing-url="/resources/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t" /> 
    <security:logout logout-url="/resources/j_spring_security_logout" /> 

    <security:intercept-url pattern="/**" access="isAuthenticated()" requires-channel="${cfma.security.channel}" /> 
</security:http> 

ne ho veramente a girare di auto-config e la necessità di configurare tutti i filtri a mano? - Se questo è vero, qualcuno può fornire un esempio per favore?


Il modo per aggiungere semplicemente un security:custom-filter:

<security:http ...> 

    <security:form-login login-processing-url="/resources/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t" /> 
    <security:custom-filter ref="lowerCaseUsernamePasswordAuthenticationFilter" position="FORM_LOGIN_FILTER"/> 
    ... 
</security:http> 

non risultare in un'eccezione con quel messaggio:

Configurazione problema: fagioli filtro <lowerCaseUsernamePasswordAuthenticationFilter> e 'fagiolo di Root: classe [ org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter]; portata =; astratta = false; lazyInit = falso; autowireMode = 0; dependencyCheck = 0; autowireCandidate = true; primaria = falso; factoryBeanName = null; factoryMethodName = null; initMethodName = null; destroyMethodName = null 'ha lo stesso valore' ordine '. Quando si utilizzano i filtri personalizzati, assicurarsi che le posizioni non siano in conflitto con i filtri predefiniti. In alternativa è possibile disabilitare i filtri predefiniti rimuovendo gli elementi figlio corrispondenti ed evitando l'uso di.

risposta

12

L'ho fatto scrivendo manualmente i fagioli autoconfigurati necessari. Questo è il risultato:

<!-- HTTP security configurations --> 
<security:http auto-config="false" use-expressions="true" entry-point-ref="loginUrlAuthenticationEntryPoint"> 

    <!-- 
    <security:form-login login-processing-url="/resources/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t" /> 
     replaced by lowerCaseUsernamePasswordAuthenticationFilter 
     the custom-filter with position FORM_LOGIN_FILTER requries that auto-config is false! 
    --> 
    <security:custom-filter ref="lowerCaseUsernamePasswordAuthenticationFilter" position="FORM_LOGIN_FILTER"/> 
    <security:logout logout-url="/resources/j_spring_security_logout" /> 

    <security:intercept-url pattern="/**" access="isAuthenticated()" /> 
</security:http> 

<bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <property name="loginFormUrl" value="/login"/> 
</bean> 

<bean id="lowerCaseUsernamePasswordAuthenticationFilter" 
    class="com.queomedia.cfma.infrastructure.security.LowerCaseUsernamePasswordAuthenticationFilter"> 
    <property name="filterProcessesUrl" value="/resources/j_spring_security_check"/> 
    <property name="authenticationManager" ref="authenticationManager"/> 
    <property name="authenticationFailureHandler"> 
     <bean class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"> 
      <property name="defaultFailureUrl" value="/login?login_error=t"/>  
     </bean> 
    </property> 
</bean> 
2

Ecco un esempio in Scala. Ho dovuto fare questo per sostituire un filtro fornito da Spring Security OAuth.

Fondamentalmente l'idea è, iniettare il FilterChainProxy e il filtro esistente che si desidera sostituire nel filtro. Trova il filtro esistente nel filterChainMap e sostituiscilo con il tuo.

import org.springframework.security.oauth2.provider.verification.{VerificationCodeFilter => SpringVerificationCodeFilter} 

@Component 
class VerificationCodeFilter extends SpringVerificationCodeFilter with InitializingBean { 
    @Autowired var filterChainProxy: FilterChainProxy = _ 
    @Autowired var springVerificationCodeFilter: SpringVerificationCodeFilter = _ 


    override def afterPropertiesSet() { 
    super.afterPropertiesSet() 

    val filterChainMap = filterChainProxy.getFilterChainMap 
    val filterChain = 
     filterChainMap.find(_._2.exists(_.isInstanceOf[SpringVerificationCodeFilter])). 
      getOrElse(throw new Exception("Could not find VerificationCodeFilter in FilterChainMap"))._2 
    val index = filterChain.indexOf(springVerificationCodeFilter) 
    filterChain.remove(index) 
    filterChain.add(index, this) 
    } 
} 
Problemi correlati