我无法解决这个问题。
我尝试识别登录注销示例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);
}
我该如何解决这个问题?如何为所有请求添加令牌标头?你能帮帮我吗?
答案 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)
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。如果它没有帮助或者至少指出正确的方向,请告诉我。