2012-04-13 9 views
14

Hay un conjunto predeterminado de filtros registrados cuando usamos el elemento <http> en nuestro archivo xml. This menciona el orden de los filtros (lo que elegimos para aplicar), y por encima de eso, se menciona:spring-security: ¿dónde puedo encontrar la lista de TODOS los filtros de seguridad registrados cuando uso el elemento <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> 

Si lo anterior es la lista de filtros por defecto, a continuación, durante la depuración, encontré que RequestCacheAwareFilter también se llama . ¿Desde dónde se llama este filtro y cuál es su posición en la cadena de filtros? ¿En qué condición está AnonymousAuthenticationFilter configurado en la cadena?

¿Cuál es la cadena de filtro predeterminada que está configurada para mí?

Editar: Tengo applicationContext.xml y springSecurity.xml. Lo que sigue es mi applicationContext.xml:

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

y este es mi springSecurity.xml

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

Respuesta

17

Si activa el registro de depuración para org.springframework.security.web.FilterChainProxy se verá, para cada solicitud, cualquier filtro que pasa a través.

Por ejemplo (también estoy usando Spring Security OAuth).

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' 

Si usted quiere conseguir los filtros mediante programación se puede inyectar el FilterChainProxy y obtener valores de la filterChainMap 's.

Por ejemplo:

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

Si solamente desea ver los filtros que <http> añade a continuación, usted debe buscar en la fuente para HttpSecurityBeanDefinitionParser.

+0

Gracias. Estaba buscando eso. HttpSecurityBeanDefinitionParser nos dará la cadena predeterminada, y podemos anular esta cadena predeterminada mediante la definición de un filterchainProxy en nuestro archivo xml. Correcto ? – Daud

+2

Sí, pero son mutuamente excluyentes. Puede definir su propio bean 'FilterChainProxy' o usar' 'pero no ambos. De forma alternativa, puede reemplazar filtros o agregar/eliminar de la cadena de filtros que '' configure. – sourcedelica

+0

Estaba a punto de escribir sobre cómo habilitar la depuración :) – Xaerxess

1

lista casi completa de filtros tipos de Primavera de seguridadis here, a pesar de tenerlo todo es posible mostrar todos GenericFilterBean en las subclases de SEC y lea chapters 8-13 of Spring Security reference manual porque, por ejemplo, puede elegir una de las pocas implementaciones de AbstractPreAuthenticatedProcessingFilter (y añada su propia extensión de filtros existentes o GenericFilterBean).

ejemplo, usted tiene aquí utiliza la configuración de frijol FilterChainProxy través filter-chain elemento y no es una cadena por defecto - debe definir explícitamente sus propias cadenas con el fin de aplicar filtros en las peticiones.


Por otra parte usted está planteando <http> elemento: tiene auto-config attribute el que hace lo siguiente:

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

que es creación de form-login, autenticación básica y cierre de sesión servicios de asistencia respectivamente .


RequestCacheAwareFilter se llama porque es probablemente incluido en cadena de filtros de su aplicación - su context.xml sería útil aquí. se añade

AnonymousAuthenticationFilter (y cualquier otro filtro) para la cadena si se agrega el grano a través de <sec:filter-chain> elemento y configurar frijol con ID dado (por lo general es el nombre de clase empiezan con la letra minúscula es decir anonymousAuthenticationFilter). Por ejemplo:

<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

Gracias. Pero en ninguna parte he configurado AnonymousAuthenticationFilter o RequestCacheAwareFilter. El elemento de autoconfiguración también es 'falso'. No tengo bean con id FilterChainProxy. De alguna manera, todo esto se está configurando automáticamente. Tengo y en mi archivo xml, pero dudo que estén configurando la cadena de filtros para mí. – Daud

+0

¿Puedes mostrar tu 'security-context.xml'? – Xaerxess

+0

He agregado los 2 archivos xml – Daud

22

Otra cosa que puede hacer en la primavera de Seguridad 3.1 es añadir

<sec:debug /> 

o

@EnableWebSecurity(debug = true)

a su contexto de aplicación. Esto agrega un filtro adicional que (entre otras cosas) informa la lista de filtros de seguridad que se aplicarán a cada solicitud.

Cuestiones relacionadas