我有斜角前端和弹簧后端。我正在使用Spring Security来处理HTTP基本身份验证。 我注意到使用高级Rest Client(或任何其他)和有角度的Web应用程序在行为上有奇怪的区别。
对于测试,我禁用了httpInterceptor,因此它不包含“ Authorisation:Basic foobardoofab ==“标头。因此,春季后端应该以未经授权的错误响应对吗?好吧...有时候会,有时候不会。
流程是这样的: 我使用身份验证方法登录:
authenticate(credentials, callback) {
const headers = new HttpHeaders(credentials ? {
authorization : 'Basic ' + btoa(credentials.username + ':' + credentials.password)
} : {});
this.http.get('http://localhost:8080/login', {headers: headers}).subscribe(response => {
if (response['name']) {
let authString = 'Basic ' + btoa(credentials.username + ':' + credentials.password);
sessionStorage.setItem('basicauth', authString);
sessionStorage.setItem('username', response['name']);
sessionStorage.setItem('role', response['authorities']);
} else {
// this.authenticated = false;
}
return callback && callback();
});
}
这些值仅存储用于在角度应用程序中访问。
现在我去http://localhost:4200/events
在此组件中,我在ngOninit中有GET请求
ngOnInit() {
this.http.get<Array<MyEvent>>('http://localhost:8080/events').subscribe((response) => {
this.events = response;});
}
因为我的httpinterceptor被禁用,所以我不添加此“ basicauth”存储在会话中,因此spring应该以未经授权的方式进行响应。确实如此:
{"timestamp":"2019-04-26T13:08:19.167+0000","status":401,"error":"Unauthorized","message":"Unauthorized","path":"/events"}
我认为这是很好的并且是预期的行为。(因为我没有发送basicauth,所以我无法通过spring安全性。
但是在第二种情况下,我与一些其他客户端(高级的其他客户端)进行即时通讯测试
我将GET请求发送到http://localhost:8080/login,并在标头中添加了“授权:基本foobar”,从Spring得到200 OK响应。
现在,我将get请求发送到http://localhost:8080/events,而没有包含任何标头,但我仍然收到200 OK响应并可以访问返回的对象。 (虽然通过角度应用程序,它会以未授权的错误响应) 为了获得无误的错误,我必须将GET请求发送至http://localhost:8080/logout(通过有角度的应用程序,我不会将其发送到任何地方)
所以我的问题是为什么这两种情况在行为上不同?
我还将显示我的WebSecurityConifg:
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().httpBasic()
.and()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/index.html", "/", "/home", "/login").permitAll()
.anyRequest().authenticated().and()
.logout().invalidateHttpSession(true).deleteCookies("JSESSIONID").and()
.csrf().disable();
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
UrlBasedCorsConfigurationSource source = new
UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
return source;
}
}