浏览器中的其余客户端和Web应用中对基本身份验证的不同处理

时间:2019-04-26 13:30:09

标签: java angular spring-security basic-authentication

我有斜角前端和弹簧后端。我正在使用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;
    }
}

0 个答案:

没有答案