spring boot angular js http:/ localhost:8080 / logout 403禁止出错

时间:2017-07-31 14:33:57

标签: java angularjs spring-boot spring-security

我无法解决这个问题。

我尝试识别登录注销示例here。登录工作正常,但当我尝试注销时,浏览器会给出NetworkError:403禁止的localhost:禁止8080 / logout。

在我看来,我应该从ui方面的每个请求添加令牌标题。但我不知道并且发现我该怎么做?

这是浏览器开发者工具消息:

  

POST 403    {“timestamp”:1501570024381,“status”:403,“error”:“禁止”,“消息”:“无效的CSRF令牌'null'是    在请求参数'_csrf'或标题'X-CSRF-TOKEN'上找到。“,”path“:”/ helpdesk / logout“}

这是我的角度退出功能:

 $scope.logout = function() {
    $http.post('logout',{}).success(function() {
      $rootScope.authenticated = false;
      $location.path("/home");
    }).error(function(data) {
      $rootScope.authenticated = false;
    });
  }

这是我的SpringSecurityConfig配置方法:

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .httpBasic().and()
            .authorizeRequests()
            .antMatchers("/index.html","/pages/**","/","/webjars/**")
            .permitAll()
            .anyRequest()
            .authenticated().and().logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).permitAll()
            .logoutSuccessHandler(logoutSuccess)
            .deleteCookies("JSESSIONID").invalidateHttpSession(false)
            .and()
            .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);

}

我该如何解决这个问题?如何为所有请求添加令牌标头?你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我解决了我的问题:

首先,当我研究goole时,我发现this sample

之后我应用了同样的拦截器我的应用程序:

app.factory('CsrfTokenInterceptorService', ['$q',
function CsrfTokenInterceptorService($q) {

    // Private constants.
    var CSRF_TOKEN_HEADER = 'X-CSRF-TOKEN',
        HTTP_TYPES_TO_ADD_TOKEN = ['DELETE', 'POST', 'PUT'];

    // Private properties.
    var token;

    // Public interface.
    var service = {
        response: onSuccess,
        responseError: onFailure,
        request: onRequest,
    };

    return service;

    // Private functions.
    function onFailure(response) {
        if (response.status === 403) {
            console.log('Request forbidden. Ensure CSRF token is sent for non-idempotent requests.');
        }

        return $q.reject(response);
    }

    function onRequest(config) {
        if (HTTP_TYPES_TO_ADD_TOKEN.indexOf(config.method.toUpperCase()) !== -1) {
            config.headers[CSRF_TOKEN_HEADER] = token;
        }

        return config;
    }

    function onSuccess(response) {
        var newToken = response.headers(CSRF_TOKEN_HEADER);

        if (newToken) {
            token = newToken;
        }

        return response;
    }
}]);

并添加到app.config方法中:

$httpProvider.defaults.xsrfHeaderName = 'X-CSRF-TOKEN';
$httpProvider.interceptors.push('CsrfTokenInterceptorService');

但现在我又遇到了另一个问题。浏览器开始打开自定义身份验证弹出窗口我必须解决这个问题。

答案 1 :(得分:0)

对于SpringSec的所有CSRF请求,将检查

post令牌。因此,您可以每次都包含它,或者禁用它。 XML配置看起来像这样:

<http ...... >

  <!-- ... -->
  <csrf disabled="true"/>

</http>

或者只需在config中添加以下内容:

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()
            .httpBasic().and()
            .authorizeRequests()
            .antMatchers("/index.html","/pages/**","/","/webjars/**")
            .permitAll()
            .anyRequest()
            .authenticated().and().logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).permitAll()
            .logoutSuccessHandler(logoutSuccess)
            .deleteCookies("JSESSIONID").invalidateHttpSession(false)
            .and()
            .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);

}

这样您就不需要关心它的包含。要正确处理CSRF Tokens,请查看Spring Security’s Cross Site Request Forgery (CSRF) support.

P.S。如果它没有帮助或者至少指出正确的方向,请告诉我。