2016-06-04 10 views
7

Ich habe eine Feder-Anwendung mit den Konfigurationsdateien wie unten gezeigt. Alle Configs scheinen korrekt zu sein, aber während des Debuggens habe ich festgestellt, dass während der Initialisierung Spring zwei Beans für FilterSecurityInterceptor eine ohne Intercept-URL-Regeln und die andere mit den Regeln, die ich angegeben habe. Wenn eine Anfrage kommt, verwendet sie die FilterSecurityInterceptor-Bean ohne Intercept-URL-Regeln. So sehe ich das folgende Protokoll:Spring FilterChainProxy mit filterSecurityInterceptor funktioniert nicht richtig?

DEBUG FilterSecurityInterceptor:183 - Public object - authentication not attempted 

Aber die Anfrage URL fällt unter die URL-Regel abfangen. Ich debuggte und fand, dass dies daran liegt, dass die verwendete Bean keine Intercept-Regeln in httpMethodMap von DefaultFilterInvocationSecurityMetadataSource hatte. Ich bin mir nicht sicher, was hier falsch ist.

Unten ist die 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> 

hier jede Hilfe dankbar.

Antwort

6

Sie haben <security:http> Element in der Konfig. Aus der Dokumentation:

38.1.2 <http>
Jeder <http> Namespace-Block immer schafft eine SecurityContextPersistenceFilter, ein ExceptionTranslationFilter und ein FilterSecurityInterceptor. Diese sind festgelegt und können nicht durch Alternativen ersetzt werden.

So wird Ihre <bean id="filterSecurityInterceptor"> ignoriert. Statt

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

sollten Sie <security:http> ändern etwas wie

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

Sie enthalten nicht <bean id="accessDecisionManager"> müssen, weil (Zitat aus dem docs) „standardmäßig eine AffirmativeBased Implementierung mit einem RoleVoter verwendet wird und ein AuthenticatedVoter ", was genau Sie definieren.

Auch Ihre <bean id="securityContextFilter"> wird ignoriert, stattdessen sollten Sie security-context-repository-ref="securityContextRepository" Attribut zu http Element hinzufügen.
Und Ihre <bean id="exceptionTranslator"> wird ignoriert, ich bin mir nicht sicher, wie man es richtig ersetzt.

Und Sie manuell eine Menge org.springframework.security Bohnen definieren. Ich vermute, dass die meisten von ihnen entweder unnötig sind (standardmäßig definiert), oder sollten mit spezialisierten Elementen security: Namespace anstelle von rohen Frühling bean s definiert werden.