2012-04-13 10 views
14

Có một bộ bộ lọc mặc định được đăng ký khi chúng tôi sử dụng phần tử <http> trong tệp xml của chúng tôi. This đề cập đến thứ tự các bộ lọc (tùy chúng ta chọn để áp dụng), và ngay trên đó, nó đề cập đến:bảo mật mùa xuân - nơi tôi có thể tìm thấy danh sách TẤT CẢ các bộ lọc bảo mật đã đăng ký khi tôi sử dụng phần tử <http>?

<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"> 
    <constructor-arg> 
    <list> 
     <sec:filter-chain pattern="/restful/**" filters=" 
      securityContextPersistenceFilterWithASCFalse, 
      basicAuthenticationFilter, 
      exceptionTranslationFilter, 
      filterSecurityInterceptor" /> 
     <sec:filter-chain pattern="/**" filters=" 
      securityContextPersistenceFilterWithASCTrue, 
      formLoginFilter, 
      exceptionTranslationFilter, 
      filterSecurityInterceptor" /> 
    </list> 
    </constructor-arg> 
</bean> 

Nếu ở trên là danh sách các bộ lọc mặc định, sau đó trong gỡ lỗi, tôi thấy rằng RequestCacheAwareFilter còn được gọi là . Từ đâu bộ lọc này được gọi và vị trí của nó trong chuỗi bộ lọc là gì? Trong điều kiện nào là AnonymousAuthenticationFilter được định cấu hình thành chuỗi?

Chuỗi bộ lọc mặc định được định cấu hình cho tôi là gì?

Chỉnh sửa: Tôi có applicationContext.xml và springSecurity.xml. Sau đây là applicationContext.xml tôi:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop.xsd"> 

    <context:annotation-config /> 
    <context:spring-configured /> 

    <!-- Make sure that the part of the file until "End of beans" is identical 
     to bean definitions in applicationContext.xml of the main application. --> 

    <bean id="adminService" class="org.daud.admin.server.AdminServiceImpl" /> 
    <bean id="feedbackService" class="org.daud.feedback.server.FeedbackServiceImpl" /> 
    <bean id="guideService" class="org.daud.guider.server.GuiderServiceImpl" /> 
    <bean id="messageService" class="org.daud.messages.server.MessageServiceImpl" /> 
    <bean id="wsService" class="org.daud.guider.server.WSServiceImpl" /> 

    <bean id="jabxUtil" class="org.daud.common.server.services.JAXBUtil" /> 
    <bean id="serviceAdvisor" class="org.daud.common.server.ServiceAdvisor" /> 

    <bean id="userPreferences" class="org.daud.preferences.server.UserPreferencesServiceImpl" /> 

    <bean id="dynamicClientFactory" class="org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory" factory-method="newInstance" /> 

    <!-- End of beans. --> 

    <!-- For testing. --> 

    <bean id="guiderClientService" class="org.daud.guider.server.GuiderClientServiceImpl" /> 

    <bean id="entityManager" class="com.daud.jpa.DBUtil" factory-method="createEntityManager" lazy-init="true"> 
     <constructor-arg value="bb-test" /> 
    </bean> 

    <bean id="testUtil" class="com.daud.jpa.JPATestUtil" lazy-init="true"> 
     <constructor-arg ref="entityManager" /> 
     <constructor-arg value="org.daud" /> 
     <constructor-arg value="fixtures" /> 
    </bean> 

</beans> 

Và đây là springSecurity.xml tôi

<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop.xsd"> 

    <aop:aspectj-autoproxy proxy-target-class="true" /> 
    <beans:bean class="com.gwt.ss.GwtExceptionTranslator" /> 

    <global-method-security secured-annotations="enabled" access-decision-manager-ref="methodSecurityAccessDecisionManager"/> 
    <http use-expressions="true" auto-config="false" disable-url-rewriting="true" access-decision-manager-ref="urlSecurityAccessDecisionManager"> 
     <intercept-url pattern="/favicon.ico" filters="none" /> 
     <intercept-url pattern="/login.jsp" filters="none" /> 

     <!-- Allow access only to admins and superadmins for the following 2 url patterns --> 
     <intercept-url pattern="/do/admin/*" access="hasAdminStatus(3,4)" /> 
     <intercept-url pattern="/admin/*" access="hasAdminStatus(3,4)" /> 

     <intercept-url pattern="/**/*.html" access="isAuthenticated()" /> <!-- access="isAuthenticated()"--> 
     <intercept-url pattern="/do/**" access="isAuthenticated()" /> 
     <intercept-url pattern="/**" access="isAuthenticated()" /> 
     <custom-filter after="FILTER_SECURITY_INTERCEPTOR" ref="switchUserProcessingFilter"/> 

     <form-login login-page="/login" login-processing-url="/do/login" authentication-failure-url="/login?authfailed=true" authentication-success-handler-ref="myAuthenticationSuccessHandler"/> 

     <!-- Using success-handler-ref instead of logout-success-url for asynchronous logout. --> 
     <logout invalidate-session="true" success-handler-ref="logoutSuccessHandler" logout-url="/do/logout" /> 
    </http> 

    <beans:bean id="urlSecurityAccessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> 
     <beans:property name="decisionVoters"> 
      <beans:list> 
       <beans:bean class="org.springframework.security.web.access.expression.WebExpressionVoter"> 
        <beans:property name="expressionHandler" ref="myWebSecurityExpressionHandler"/> 
       </beans:bean> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 
    <beans:bean id="myWebSecurityExpressionHandler" class="org.daud.common.server.security.MyWebSecurityExpressionHandler"/> 
    <beans:bean id="myWebSecurityExpressionRoot" class="org.daud.common.server.security.MyWebSecurityExpressionRoot" scope="prototype"/> 
    <!-- For asynchronous login --> 

    <beans:bean id="methodSecurityAccessDecisionManager" 
     class="org.springframework.security.access.vote.AffirmativeBased"> 
     <beans:property name="decisionVoters"> 
      <beans:list> 
       <beans:bean class="org.springframework.security.access.vote.RoleVoter" p:rolePrefix="" /> 
       <beans:bean class="org.springframework.security.access.vote.AuthenticatedVoter" /> 
       <beans:bean class="org.daud.common.server.security.AllowPrivilegedRolesVoter"> 
        <beans:property name="privilegedRoleTypes"> 
         <beans:set> 
          <beans:value>ROOT</beans:value> 
         </beans:set> 
        </beans:property> 
       </beans:bean> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 

    <beans:bean class="com.gwt.ss.GwtUsernamePasswordAuthority"> 
     <beans:property name="authenticationManager" ref="authenticationManager" /> 
    </beans:bean> 
    <beans:bean id="myAuthenticationSuccessHandler" class="org.daud.common.server.security.myAuthenticationSuccessHandler"> 
     <!-- If redirection after logging in is to URLs containing these strings, the redirection will instead be to '/' --> 
     <beans:property name="partialURLsRequiringRedirection"> 
      <beans:list> 
       <beans:value>/do/</beans:value> 
       <beans:value>/exitUser</beans:value> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 
    <beans:bean id="userSwitchSuccessHandler" class="org.daud.common.server.security.myUserSwitchSuccessHandler"/> 
    <beans:bean id="userServices" class="org.daud.common.server.security.myUserServices"/> 

    <beans:bean id="switchUserProcessingFilter" class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter"> 
     <beans:property name="userDetailsService" ref="userServices" /> 
     <beans:property name="switchUserUrl" value="/admin/switchUser" /> 
     <beans:property name="exitUserUrl" value="/admin/exitUser" /> 
     <beans:property name="successHandler" ref="userSwitchSuccessHandler"></beans:property> 
    </beans:bean> 

    <!-- For asynchronous logout --> 

    <beans:bean id="logoutSuccessHandler" class="com.gwt.ss.GwtLogoutSuccessHandler" p:logoutSuccessUrl="/login" /> 

    <beans:bean id="myAuthenticationProvider" class="org.daud.common.server.security.myAuthenticationProvider" /> 
    <authentication-manager alias="authenticationManager"> 
     <authentication-provider ref="myAuthenticationProvider" /> 
    </authentication-manager> 

</beans:beans> 

Trả lời

17

Nếu bạn bật đăng nhập gỡ lỗi cho org.springframework.security.web.FilterChainProxy, bạn sẽ thấy, cho mỗi yêu cầu, mọi bộ lọc đi qua.

Ví dụ: (Tôi cũng đang sử dụng OAuth bảo mật mùa xuân).

11:18:39.123 FilterChainProxy - /user/login at position 1 of 17 in additional filter chain; firing Filter: 'BasicUserApprovalFilter' 
11:18:39.123 FilterChainProxy - /user/login at position 2 of 17 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter' 
11:18:39.124 FilterChainProxy - /user/login at position 3 of 17 in additional filter chain; firing Filter: 'LogoutFilter' 
11:18:39.124 FilterChainProxy - /user/login at position 4 of 17 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter' 
11:18:39.124 FilterChainProxy - /user/login at position 5 of 17 in additional filter chain; firing Filter: 'BasicAuthenticationFilter' 
11:18:39.124 FilterChainProxy - /user/login at position 6 of 17 in additional filter chain; firing Filter: 'RequestCacheAwareFilter' 
11:18:39.124 FilterChainProxy - /user/login at position 7 of 17 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter' 
11:18:39.124 FilterChainProxy - /user/login at position 8 of 17 in additional filter chain; firing Filter: 'RememberMeAuthenticationFilter' 
11:18:39.125 FilterChainProxy - /user/login at position 9 of 17 in additional filter chain; firing Filter: 'ForgotPasswordAuthenticationFilter' 
11:18:39.125 FilterChainProxy - /user/login at position 10 of 17 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter' 
11:18:39.125 FilterChainProxy - /user/login at position 11 of 17 in additional filter chain; firing Filter: 'SessionManagementFilter' 
11:18:39.125 FilterChainProxy - /user/login at position 12 of 17 in additional filter chain; firing Filter: 'ExceptionTranslationFilter' 
11:18:39.125 FilterChainProxy - /user/login at position 13 of 17 in additional filter chain; firing Filter: 'OAuth2ExceptionHandlerFilter' 
11:18:39.125 FilterChainProxy - /user/login at position 14 of 17 in additional filter chain; firing Filter: 'VerificationCodeFilter' 
11:18:39.125 FilterChainProxy - /user/login at position 15 of 17 in additional filter chain; firing Filter: 'OAuth2AuthorizationFilter' 
11:18:39.125 FilterChainProxy - /user/login at position 16 of 17 in additional filter chain; firing Filter: 'OAuth2ProtectedResourceFilter' 
11:18:39.125 FilterChainProxy - /user/login at position 17 of 17 in additional filter chain; firing Filter: 'FilterSecurityInterceptor' 

Nếu bạn muốn nhận được các bộ lọc theo chương trình bạn có thể tiêm các FilterChainProxy và nhận được các giá trị của filterChainMap.

Ví dụ:

@Autowired var filterChainProxy: FilterChainProxy = _ 
//... 
val filterChains = filterChainProxy.getFilterChainMap.values 

Nếu bạn chỉ muốn xem các bộ lọc mà <http> thêm thì bạn nên nhìn vào các nguồn cho HttpSecurityBeanDefinitionParser.

+0

Cảm ơn. Tôi đang tìm kiếm điều đó. HttpSecurityBeanDefinitionParser sẽ cung cấp cho chúng ta chuỗi mặc định, chúng ta có thể ghi đè chuỗi mặc định này thông qua việc định nghĩa một filterchainProxy trong tệp xml của chúng ta. Đúng ? – Daud

+2

Có, nhưng chúng loại trừ lẫn nhau. Bạn có thể xác định bean 'FilterChainProxy' của riêng bạn hoặc sử dụng' 'nhưng không phải cả hai. Ngoài ra, bạn có thể thay thế bộ lọc hoặc thêm vào/xóa khỏi chuỗi bộ lọc mà '' thiết lập. – sourcedelica

+0

Tôi vừa mới viết về cách bật gỡ lỗi :) – Xaerxess

1

danh sách Hầu như toàn bộ lọc loại mùa xuân an nhânis here, mặc dù có mọi thứ bạn có thể hiển thị tất cả GenericFilterBean 's lớp con trong SEC và đọc chapters 8-13 of Spring Security reference manual bởi vì, ví dụ, bạn có thể chọn một trong số ít AbstractPreAuthenticatedProcessingFilter triển khai (và thêm bạn sở hữu bằng cách mở rộng các bộ lọc hiện tại hoặc GenericFilterBean).

Ví dụ bạn có ở đây sử dụng cấu hình đậu của FilterChainProxy qua filter-chain phần tử và không một chuỗi mặc định - bạn phải xác định một cách rõ ràng chuỗi của riêng bạn để áp dụng bộ lọc trên yêu cầu.


Mặt khác bạn đang hỏi về <http> yếu tố: nó có auto-config attribute mà làm như sau:

<http> 
    <form-login /> 
    <http-basic /> 
    <logout /> 
    </http> 

đó là thiết lập hình thức đăng nhập, xác thực cơ bản và đăng xuất dịch vụ xử lý tương ứng .


RequestCacheAwareFilter được gọi vì nó có thể được bao gồm trong chuỗi bộ lọc của ứng dụng - context.xml của bạn sẽ hữu ích ở đây.

AnonymousAuthenticationFilter (và bất kỳ bộ lọc nào khác) được thêm vào chuỗi nếu bạn thêm hạt qua yếu tố <sec:filter-chain> và định cấu hình bean với id đã cho (thường là tên lớp bắt đầu bằng chữ cái thấp hơn tức là anonymousAuthenticationFilter). Ví dụ:

<bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"> 
    <constructor-arg> 
    <list> 
     <sec:filter-chain pattern="/anonym/**" filters=" 
      anonymousAuthenticationFilter" /> 
     <sec:filter-chain pattern="/**" filters="none" /> 
    </list> 
    </constructor-arg> 
</bean> 

<bean id="anonymousAuthenticationFilter" 
    class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter"> 
    <property name="key" value="foobar"/> 
    <property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS"/> 
</bean> 

<bean id="authenticationManager" 
    class="org.springframework.security.authentication.ProviderManager"> 
    <property name="providers"> 
    <list> 
     <ref local="anonymousAuthenticationProvider"/> 
    </list> 
    </property> 
</bean> 

<bean id="anonymousAuthenticationProvider" 
    class="org.springframework.security.authentication.AnonymousAuthenticationProvider"> 
    <property name="key" value="foobar"/> 
</bean> 
+0

Cảm ơn. Nhưng không nơi nào tôi đã cấu hình AnonymousAuthenticationFilter hoặc RequestCacheAwareFilter. Phần tử tự động cấu hình cũng là 'false'. Tôi không có bean với Id FilterChainProxy. Bằng cách nào đó, tất cả điều này đang được cấu hình tự động. Tôi có trong tệp xml của mình, nhưng tôi nghi ngờ rằng chúng đang thiết lập chuỗi bộ lọc cho tôi. – Daud

+0

Bạn có thể hiển thị 'security-context.xml' của mình không? – Xaerxess

+0

Tôi đã thêm 2 tệp xml – Daud

22

Một điều bạn có thể làm ở Xuân An 3.1 là thêm

<sec:debug /> 

hoặc

@EnableWebSecurity(debug = true)

đến bối cảnh ứng dụng của bạn. Điều này cho biết thêm một bộ lọc bổ sung mà sẽ (trong số những thứ khác) báo cáo danh sách các bộ lọc bảo mật sẽ được áp dụng cho mỗi yêu cầu.

Các vấn đề liên quan