2016-06-04 17 views
7

Ho un'applicazione a molla con i file di configurazione come mostrato di seguito. Tutte le configurazioni sembrano corrette ma durante il debug ho rilevato che, durante la fase di inizializzazione, crea due bean per FilterSecurityInterceptor uno senza le regole di intercettazione-url e l'altro con le regole che ho specificato. Quando arriva una richiesta, utilizza il bean FilterSecurityInterceptor senza regole intercettare-url. Quindi vedo il seguente registro:Spring FilterChainProxy con filterSecurityInterceptor che non funziona correttamente?

DEBUG FilterSecurityInterceptor:183 - Public object - authentication not attempted 

Ma l'URL della richiesta rientra nella regola dell'URL di intercettazione. Ho eseguito il debug e ho rilevato che ciò è dovuto al fatto che il bean utilizzato non disponeva di regole di intercettazione nello httpMethodMap di DefaultFilterInvocationSecurityMetadataSource. Non sono sicuro di cosa c'è che non va qui.

riportano di seguito le applicationContext-security.xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:security="http://www.springframework.org/schema/security" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd" 
    default-init-method="init"> 

    <security:authentication-manager alias="authenticationManager"> 
     <security:authentication-provider 
      user-service-ref="userDetailService"> 
     </security:authentication-provider> 
    </security:authentication-manager> 

    <alias name="filterChainProxy" alias="springSecurityFilterChain" /> 

    <bean id="accessDecisionManager" 
     class="org.springframework.security.access.vote.AffirmativeBased"> 
     <property name="decisionVoters"> 
      <list> 
       <bean class="org.springframework.security.access.vote.RoleVoter" /> 
       <bean class="org.springframework.security.access.vote.AuthenticatedVoter" /> 
      </list> 
     </property> 
    </bean> 

    <bean id="consoleAuthenticationSuccessHandler" 
     class="custom_class"> 
     <property name="defaultTargetUrl" value="/loginSuccess.htm" /> 
     <property name="targetUrlParameter" value="targetURL" /> 
    </bean> 

    <bean id="consoleAuthenticationFailureHandler" 
     class="custom_class"> 
     <property name="loginFailureUrl" value="/loginFailure.htm" /> 
    </bean> 

    <bean id="consoleLogoutSuccessHandler" 
     class="custom_class"> 
     <property name="logoutUrl" value="/loggedout.htm" /> 
    </bean> 

    <bean id="userDetailService" 
     class="custom_class"> 
    </bean> 

    <security:http auto-config="true" 
     security-context-repository-ref="securityContextRepository"> 
     <security:form-login authentication-failure-url="/loginFailure.htm" 
      default-target-url="/loginSuccess.htm" 
      authentication-success-handler-ref="consoleAuthenticationSuccessHandler" /> 
     <security:logout success-handler-ref="consoleLogoutSuccessHandler" /> 
     <security:anonymous enabled="false" /> 
     <security:session-management 
      session-fixation-protection="none" /> 
    </security:http> 

    <bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy"> 
     <security:filter-chain-map path-type="ant"> 
      <security:filter-chain pattern="/login.htm*" 
       filters="none" /> 
      <security:filter-chain pattern="/**" 
       filters="securityContextFilter, logoutFilter, formLoginFilter, servletApiFilter, exceptionTranslator, filterSecurityInterceptor" /> 
     </security:filter-chain-map> 
    </bean> 

    <bean id="securityContextRepository" 
     class="org.springframework.security.web.context.HttpSessionSecurityContextRepository" /> 

    <bean id="securityContextFilter" 
     class="org.springframework.security.web.context.SecurityContextPersistenceFilter"> 
     <property name="securityContextRepository" ref="securityContextRepository" /> 
    </bean> 
    <bean id="logoutFilter" 
     class="org.springframework.security.web.authentication.logout.LogoutFilter"> 
     <constructor-arg ref="consoleLogoutSuccessHandler" 
      index="0" 
      type="org.springframework.security.web.authentication.logout.LogoutSuccessHandler" /> 
     <constructor-arg> 
      <list> 
       <bean 
        class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler" /> 
      </list> 
     </constructor-arg> 
    </bean> 

    <bean id="servletApiFilter" 
     class="org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter" /> 

    <bean id="exceptionTranslator" 
     class="org.springframework.security.web.access.ExceptionTranslationFilter"> 
     <property name="authenticationEntryPoint"> 
      <bean 
       class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
       <property name="loginFormUrl" value="/login.jsp" /> 
      </bean> 
     </property> 
    </bean> 

    <bean id="formLoginFilter" 
     class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
     <property name="authenticationManager" ref="authenticationManager" /> 
     <property name="authenticationSuccessHandler" ref="consoleAuthenticationSuccessHandler" /> 
     <property name="authenticationFailureHandler" ref="consoleAuthenticationFailureHandler" /> 
    </bean> 

    <bean id="filterSecurityInterceptor" 
     class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor"> 
     <property name="securityMetadataSource"> 
      <security:filter-security-metadata-source> 
       <security:intercept-url pattern="/login.htm*" 
        access="ROLE_ANONYMOUS" /> 
       <security:intercept-url pattern="/**" 
        access="ROLE_USER,ROLE_ADMIN" /> 
      </security:filter-security-metadata-source> 
     </property> 
     <property name="accessDecisionManager" ref="accessDecisionManager" /> 
     <property name="authenticationManager" ref="authenticationManager" /> 
    </bean> 

</beans> 

Apprezzo tutto l'aiuto qui.

risposta

6

Hai l'elemento <security:http> nella configurazione. Dalla documentazione:

38.1.2 <http>
Ogni blocco <http> namespace crea sempre un SecurityContextPersistenceFilter, un ExceptionTranslationFilter e FilterSecurityInterceptor. Questi sono fissi e non possono essere sostituiti con alternative.

Quindi il vostro <bean id="filterSecurityInterceptor"> viene ignorato. Invece di

<bean id="filterSecurityInterceptor" 
    class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor"> 
    <property name="securityMetadataSource"> 
     <security:filter-security-metadata-source> 
      <security:intercept-url pattern="/login.htm*" 
       access="ROLE_ANONYMOUS" /> 
      <security:intercept-url pattern="/**" 
       access="ROLE_USER,ROLE_ADMIN" /> 
     </security:filter-security-metadata-source> 
    </property> 
    <property name="accessDecisionManager" ref="accessDecisionManager" /> 
    <property name="authenticationManager" ref="authenticationManager" /> 
</bean> 

si dovrebbe cambiare <security:http> per includere qualcosa come

<security:http ... 
     authentication-manager-ref="authenticationManager"> 
    ... 
    <security:intercept-url pattern="/login.htm*" 
     access="ROLE_ANONYMOUS" /> 
    <security:intercept-url pattern="/**" 
     access="ROLE_USER,ROLE_ADMIN" /> 
</security:http> 

Non è necessario <bean id="accessDecisionManager">, perché (citazione dal docs) "per impostazione predefinita un AffirmativeBased implementazione viene utilizzata per un RoleVoter e un AuthenticatedVoter ", che è esattamente ciò che si definisce.

Anche il tuo <bean id="securityContextFilter"> viene ignorato, invece è necessario aggiungere l'attributoall'elemento http.
E il tuo <bean id="exceptionTranslator"> viene ignorato, non sono sicuro di come sostituirlo correttamente.

E si definiscono manualmente molti fagioli org.springframework.security. Ho il sospetto che la maggior parte di loro sono o inutili (definito di default), o dovrebbero essere definite utilizzando elementi specializzati di security: namespace, invece di primavera prime bean s.

Problemi correlati