2016-06-04 16 views
7

Mam aplikację wiosną z plikami konfiguracyjnymi, jak pokazano poniżej. Wszystkie konfiguracje wydają się poprawne, ale podczas debugowania znalazłem, że podczas inicjalizacji sprężyny tworzy dwie fasole dla FilterSecurityInterceptor bez reguł przechwytywania-url, a drugie z regułami, które określiłem. Gdy przychodzi żądanie, używa fasoli FilterSecurityInterceptor bez reguł przechwytujących-url. Tak więc widzę następujący dziennik:Filtr sprężynowyChainProxy z filtremSecurityInterceptor nie działa poprawnie?

DEBUG FilterSecurityInterceptor:183 - Public object - authentication not attempted 

Jednak adres URL żądania jest objęty zasadą URL przechwytywania. Po debugowaniu i stwierdziłem, że dzieje się tak dlatego, że używane ziarno nie miało żadnych reguł przechwytywania w httpMethodMap z DefaultFilterInvocationSecurityMetadataSource. Nie jestem pewien, co jest nie tak.

Poniżej 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> 

wdzięczni za każdą pomoc tutaj.

Odpowiedz

6

Masz element <security:http> w konfiguracji. Z dokumentacji:

38.1.2 <http>
Każdy blok <http> nazw zawsze tworzy SecurityContextPersistenceFilter An ExceptionTranslationFilter i FilterSecurityInterceptor. Są one poprawione i nie można ich zastąpić alternatywnymi.

Twój <bean id="filterSecurityInterceptor"> jest zignorowany. Zamiast

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

należy zmienić <security:http> zawierać coś takiego

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

Nie potrzeba <bean id="accessDecisionManager">, ponieważ (cytat z docs) „domyślnie implementacja AffirmativeBased jest używany do z RoleVoter i AuthenticatedVoter ", który jest dokładnie tym, co definiujesz.

Również twój <bean id="securityContextFilter"> jest ignorowany, zamiast tego należy dodać atrybut security-context-repository-ref="securityContextRepository" do elementu http.
Twój <bean id="exceptionTranslator"> jest ignorowany, nie jestem pewien, jak go poprawnie wymienić.

I ręcznie definiujesz wiele fasoli org.springframework.security. Podejrzewam, że większość z nich jest albo niepotrzebna (zdefiniowana domyślnie), albo powinna być zdefiniowana przy użyciu wyspecjalizowanych elementów przestrzeni nazw security:, zamiast surowych sprężyn bean s.