2016-06-04 2 views
7

У меня есть приложение для пружин с конфигурационными файлами, как показано ниже. Все конфиги кажутся правильными, но во время отладки я обнаружил, что во время инициализации Spring создает два компонента для фильтра FilterSecurityInterceptor без правил перехвата-url, а другой с правилами, которые я указал. Когда приходит запрос, он использует компонент FilterSecurityInterceptor без правил перехвата-url. Поэтому я вижу следующий журнал:Spring FilterChainProxy с фильтромSecurityInterceptor работает неправильно?

DEBUG FilterSecurityInterceptor:183 - Public object - authentication not attempted 

Но URL-адрес запроса попадает под правило URL-адреса перехвата. Я отлаживал и обнаружил, что это связано с тем, что у использованного компонента не было правил перехвата в httpMethodMap от DefaultFilterInvocationSecurityMetadataSource. Я не уверен, что здесь не так.

Ниже 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> 

Цените любую помощь здесь.

ответ

6

У вас есть <security:http> элемент в конфигурации. Из документации:

38.1.2 <http>
Каждый блок <http> имен всегда создает SecurityContextPersistenceFilter, ExceptionTranslationFilter и FilterSecurityInterceptor. Они фиксированы и не могут быть заменены альтернативами.

Значит, ваш <bean id="filterSecurityInterceptor"> игнорируется. Вместо

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

вы должны изменить <security:http> включить что-то вроде

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

Вам не нужно <bean id="accessDecisionManager">, потому что (цитата из docs) «по умолчанию AffirmativeBased реализация используется для с RoleVoter и AuthenticatedVoter ", что именно вы определяете.

Также игнорируется ваш <bean id="securityContextFilter">, вместо этого вы должны добавить атрибут security-context-repository-ref="securityContextRepository" в элемент http.
И ваш <bean id="exceptionTranslator"> игнорируется, я не уверен, как его правильно заменить.

И вы вручную определяете много бобов org.springframework.security. Я подозреваю, что большинство из них либо не нужны (заданы по умолчанию), либо должны быть определены с использованием специализированных элементов пространства имен security: вместо необработанной пружины bean s.

Смежные вопросы