2011-10-11 2 views
14

의 하위 클래스 인 LowerCaseUsernamePasswordAuthenticationFilter을 구현했습니다.커스텀 UsernamePasswordAuthenticationFilter를 사용하도록 스프링 보안 설정하기

하지만 이제 내 문제는이 필터를 사용하기 위해 스프링 보안을 구성하는 방법이다. 위로

은 지금은 사용하기 :

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

난 정말 auto-config의 설정 및 손으로 모든 필터를 구성 할 필요합니까? - 이것이 사실이라면 누구나 예제를 제공해 줄 수 있습니까?


단순히 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> 

해당 메시지와 함께 예외가 발생 않습니다

구성 문제 : 필터 콩 <lowerCaseUsernamePasswordAuthenticationFilter>와 '루트 콩 : 클래스 [을 org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter]; scope =; 초록 = 거짓; lazyInit = false; autowireMode = 0; dependencyCheck = 0; autowireCandidate = true; 기본 = 거짓; factoryBeanName = null; factoryMethodName = null; initMethodName = null; destroyMethodName = null '같은'order '값을가집니다. 맞춤 필터를 사용할 때 위치가 기본 필터와 충돌하지 않는지 확인하십시오. 또는 해당 하위 요소를 제거하고이 필터의 사용을 피함으로써 기본 필터를 비활성화 할 수 있습니다.

답변

12

필자는 필요한 자동 구성 빈을 직접 작성하여 작성했습니다. 결과는 다음과 같습니다.

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

다음은 스칼라의 예입니다. Spring Security OAuth에서 제공하는 필터를 대체하기 위해이 작업을 수행해야했습니다.

기본적으로 생각하면 FilterChainProxy과 필터로 교체하려는 기존 필터를 삽입하십시오. filterChainMap에서 기존 필터를 찾아서 바꿉니다.

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