2011-10-11 27 views
14

He implementado mi propio LowerCaseUsernamePasswordAuthenticationFilter que es solo una subclase de UsernamePasswordAuthenticationFilter.Configurar Spring Security para usar CustomnamePasswordAuthenticationFilter

Pero ahora mi problema es cómo configurar la seguridad Spring para utilizar este filtro.

Hasta ahora he utilizado:

<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> 

es lo que realmente a su vez de auto-config y la necesidad de configurar todos los filtros de la mano? - Si esto es cierto, ¿alguien puede dar un ejemplo, por favor?


La manera de añadir simplemente una 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> 

da lugar a una excepción con ese mensaje:

Configuración problema: los granos de filtro <lowerCaseUsernamePasswordAuthenticationFilter> y 'frijol Raíz: Clase [ org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter]; alcance =; abstracto = falso; lazyInit = false; autowireMode = 0; dependencyCheck = 0; autowireCandidate = true; primario = falso; factoryBeanName = null; factoryMethodName = null; initMethodName = null; destroyMethodName = null 'tiene el mismo valor de' orden '. Al utilizar filtros personalizados, asegúrese de que las posiciones no entren en conflicto con los filtros predeterminados. Alternativamente, puede desactivar los filtros predeterminados quitando los elementos secundarios correspondientes y evitando el uso de.

Respuesta

12

Lo he hecho escribiendo los frijoles autoconfigurados necesarios a mano. Este es el resultado:

<!-- 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

Aquí hay un ejemplo en Scala. Tuve que hacer esto para reemplazar un filtro provisto por Spring Security OAuth.

Básicamente la idea es inyectar el FilterChainProxy y el filtro existente que desea reemplazar en su filtro. Busque el filtro existente en el filterChainMap y reemplácelo por el suyo.

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) 
    } 
} 
Cuestiones relacionadas