【问题标题】:Spring security post request with AJAX (Logout)使用 AJAX(注销)的 Spring 安全发布请求
【发布时间】:2015-11-15 10:17:00
【问题描述】:

当我从 Spring 3.1.1.RELEASE 迁移到 4.0.2 RELEASE 时,我不得不对 Spring 安全上下文进行一些更改。

除了 POST 注销请求外,几乎一切正常。

我可以将整行设置为 form method="POST" action="logout" 但随后我必须处理 Submit ,这与我们需要的样式完全不同。 我尝试通过 ajax 发送带有 csrf 数据的注销请求,但没有成功。 任何帮助是极大的赞赏。附言禁用 csrf 不是一种选择。

 <!-- JSP -->
 <meta name="_csrf" content="${_csrf.token}"/>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>

<!--Anchor -->
<a id="loggg" href="logout">Logout1</a>

<!-- jquery -->
$("#loggg").click(function(e){
    e.preventDefault();
     var token = $("meta[name='_csrf']").attr("content");
      var header = $("meta[name='_csrf_header']").attr("content");
    $.ajax({
        url : "logout",
        method : "POST",
        data :token ,
        success : function(data) { 
            console.log("clicked");
        }, 
        error : function(data) {
            console.log(data);
        }
    });

})

FireBug 开发者控制台返回:

403 Forbidden 2ms
"NetworkError: 403 Forbidden - http://localhost:8081/nekretnine/logout"
Object { readyState=4,  responseText="<!DOCTYPE html><html> 
<he...EASE</h3></body></html>",  status=403,  more...}

【问题讨论】:

    标签: jquery ajax spring spring-security


    【解决方案1】:

    如果您的 login 是来自同一页面的 AJAX 请求,那将更改服务器中的令牌。 Spring Security changes the tokenloginlogout 等事件中。

    因此,您在页面中的令牌将不再有效。

    如果是这种情况,一种方法是在过滤器将令牌作为 cookie 附加后使用 GET 请求获取新令牌,如 here 所述。

    This 也可能会有所帮助。

    【讨论】:

    • 感谢您的回复。我几乎可以肯定问题出在 ajax 发布请求中。我用常规形式和按钮做了一个小测试,而不是锚点,它工作得很好。有什么想法吗?
    • 快速猜测:AJAX 请求中的data: token 似乎没问题?令牌不应该作为表单参数、_csrf:token-val 格式或类似格式的标头发布吗?
    【解决方案2】:

    我已经设法部分解决了这个问题。这个答案适用于那些可能会遇到与我从 Spring Security 3.1.1 迁移到 Spring security 4.0.2 时遇到的相同问题的人

    JSP

     <meta name="_csrf" content="${_csrf.token}"/>
     <!-- default header name is X-CSRF-TOKEN -->
     <meta name="_csrf_header" content="${_csrf.headerName}"/>
    

    <a id="loggg" href="logout">Logout1</a>
    

    jQuery

    $("#loggg").click(function(e){
        e.preventDefault();
         var token = $("meta[name='_csrf']").attr("content");
          var header = $("meta[name='_csrf_header']").attr("content");
        $.ajax({
            url : 'logout',
            type : 'POST',
            data: token,
            beforeSend:function(xhr){
                 xhr.setRequestHeader(header, token);
            },
            success : function(data) { 
                window.location ="/home";    here is the only problem, for some reason after logging out page doesnt refresh and i can still see myself logged in. Then i usually just press f5 and i am logged out.
            }, 
            error : function(data) {
                console.log(data);
            }
        });
    
    })
    

    当我从 Spring security 3 更改为 Spring Security 4 时,我注意到的几个问题。 这里有一些:

    属性不再是 j.username i j.password 而是使用-用户名密码

    1. Action 不再是 j_spring_security_check ,而是使用 - login
    2. 注销操作不再是 j_spring_security_logout 使用注销
    3. 必须发布请求,即使注销也是如此。
    4. 你需要添加 CSRF 令牌

    &lt;input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/&gt;

    到表单,或者如果你使用弹簧表单,csrf.token 将被自动添加。你也可以使用

    你需要添加这些过滤器(你必须在 Spring 安全过滤器之前添加它们)

    <filter>
            <display-name>springMultipartFilter</display-name>
                 <filter-name>springMultipartFilter</filter-name>
            <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
        </filter>
        <filter-mapping>
                 <filter-name>springMultipartFilter</filter-name>
                 <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    1. 您可能正在使用 multipartResolver 解析器 bean,您需要将其更改为 <beans:bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <beans:property name="maxUploadSize" value="-1" />

    2. 1234563你最终会走到一条死胡同,不知道该怎么做。解决方案非常简单,只需将 bean 移动到 root-context.xml 和 voala!一切正常。

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      相关资源
      最近更新 更多