Spring Security-все запросы jQuery Ajax post возвращают 404

все мои $.ajax, и POST и GET работали нормально, но как только я интегрировал Spring security 3.2.6 в моем проекте POST ajax запросы перестали работать без loggin каких-либо проблем.

весна-безопасности.в XML

<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://www.springframework.org/schema/security"
             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-3.2.xsd">

    <!--Permit all Web resources to bypass proxy-->
    <http pattern="/js/**" security="none"/>
    <http pattern="/css/**" security="none"/>
    <http pattern="/fonts/**" security="none"/>
    <http pattern="/images/**" security="none"/>

    <http auto-config="true" use-expressions="true" >

        <intercept-url pattern="/login" access="isAnonymous()"/>

        <intercept-url pattern="/workflow**" access="hasRole('ROLE_WORKFLOW_ADMIN')"/>
        <intercept-url pattern="/**" access="hasAnyRole('ROLE_ADMIN','ROLE_WORKFLOW_ADMIN','ROLE_DMS_ADMIN')"/>

        <access-denied-handler error-page="/403"/>

        <form-login
                login-page="/login"
                default-target-url="/dashboard"
                authentication-failure-url="/login?error"
                username-parameter="username"
                password-parameter="password"/>

        <logout invalidate-session="true" logout-success-url="/login?logout"/>

        <csrf/>
    </http>

    <!-- Select users and user_roles from database -->
    <authentication-manager>
        <authentication-provider ref="daoAuthenticationProvider"/>
    </authentication-manager>

    <beans:bean id="daoAuthenticationProvider"
                class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="authService"/>
    </beans:bean>


</beans:beans>

Web.в XML

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

    <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/mvc-dispatcher-servlet.xml
            /WEB-INF/spring-security.xml
        </param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error</location>
    </error-page>

</web-app>

редактировать


URL, к которому я пытаюсь получить доступ, -

http://localhost:8080/ADMIN/workflow/sample-ajax

может ли это быть чем-то с spring security ?

3 ответов


наконец, после трех мучительных дней, я нашел проблему и мальчик был глуп.

проблема заключалась в том, что я включил csrf защита весной безопасности. И это привело к тому, что мои почтовые запросы были запрещены, что вызывает access-denied-handler страница ошибки, так как я не сопоставил мой access-denied-handlerдо "/403" страница ошибки, как показано ниже, my http 403/401 был замаскирован http 404

<access-denied-handler error-page="/403"/>

короче

  1. карту access-denied-handler страница ошибки к допустимому url
  2. если вы используете защиту csrf, всегда убедитесь, что вы передаете их в запросе AJAX post как таковой

$.данные технологии Ajax({метод :'пост', URL-адрес : '/Аякс', : {"${_csrf.parameterName}": "${_csrf.token}"}});


есть еще одна ситуация, с которой необходимо проконсультироваться специально, когда вы реализуете spring security 4, нужна кнопка формы (а не "href").

https://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection/#ajax-requests.

a> форма post запрос отправлен: тип ввода скрыт в и вход/выход кнопки

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

B> для запроса AJAX post добавьте следующее на страницу JSP после taglib декларативные заявления.

<meta name="_csrf" content="${_csrf.token}" />
<meta name="_csrf_header" content="${_csrf.headerName}" />

и кое-где выше закрытия тело тег в jsp любой где как он "наготове"

<script type="text/javascript">
$(function() {
    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");
    $(document).ajaxSend(function(e, xhr, options) {
        xhr.setRequestHeader(header, token);
    });
});
 </script>

это должно работать! если у вас остались проблемы с CORS, см. статью ниже. http://www.html5rocks.com/en/tutorials/cors/


вы пытались опубликовать с помощью обычного http-запроса для использования spring security вы должны использовать определенный набор имен переменных, которые вы можете google .

также проверьте, можем ли мы отправить запрос post на ограниченный URL с помощью AJAX.