2011-10-11 38 views
14

Tôi đã triển khai LowerCaseUsernamePasswordAuthenticationFilter riêng của mình mà chỉ là một lớp con của UsernamePasswordAuthenticationFilter.Định cấu hình bảo mật mùa xuân để sử dụng tên người dùng tùy chỉnhPasswordAuthenticationFilter

Nhưng bây giờ vấn đề của tôi là, cách cấu hình bảo mật mùa xuân để sử dụng bộ lọc này.

Cho đến nay tôi đã sử dụng:

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

Tôi thực sự để biến của auto-config và cần phải cấu hình tất cả các bộ lọc bằng tay? - Nếu điều này là đúng, không ai có thể cung cấp một ví dụ xin vui lòng?


Cách để thêm đơn giản là một 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> 

không gây ra một ngoại lệ với thông điệp rằng:

Cấu hình vấn đề: Lọc đậu <lowerCaseUsernamePasswordAuthenticationFilter> và 'gốc đậu: lớp [ org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter]; scope =; abstract = false; lazyInit = false; autowireMode = 0; dependencyCheck = 0; autowireCandidate = true; primary = false; factoryBeanName = null; factoryMethodName = null; initMethodName = null; destroyMethodName = null 'có cùng giá trị' order '. Khi sử dụng các bộ lọc tùy chỉnh, hãy đảm bảo các vị trí không xung đột với các bộ lọc mặc định. Hoặc bạn có thể tắt các bộ lọc mặc định bằng cách xóa các phần tử con tương ứng khỏi và tránh sử dụng.

Trả lời

12

Tôi đã làm điều đó bằng cách viết các bean được tự động định cấu hình cần thiết bằng tay. Đây là kết quả:

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

Đây là ví dụ trong Scala. Tôi phải làm điều này để thay thế một bộ lọc được cung cấp bởi Spring Security OAuth.

Về cơ bản ý tưởng là, hãy tiêm FilterChainProxy và bộ lọc hiện tại mà bạn muốn thay thế vào bộ lọc của mình. Tìm bộ lọc hiện tại trong filterChainMap và thay thế bộ lọc đó bằng bộ lọc của bạn.

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) 
    } 
} 
Các vấn đề liên quan