Различная обработка базовой аутентификации в клиенте отдыха и веб-приложении в браузере - PullRequest
1 голос
/ 26 апреля 2019

У меня есть угловой фронтэнд и пружинный бэкэнд. Я использую Spring Security, чтобы изменить базовую аутентификацию http. Я заметил странную разницу в поведении с помощью расширенного клиента отдыха (или любого другого) и углового веб-приложения.

Для тестов я отключил свой httpInterceptor, поэтому он не включает заголовок «Authorization: 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

В этом компоненте у меня есть запрос GET в ngOninit

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, я не могу пройти через весеннюю безопасность.

Но есть второй случай, когда я тестирую его с некоторыми клиентами отдыха (продвинутый клиент отдыха)

Я отправляю запрос GET на http://localhost:8080/login с добавлением к заголовкам сообщения «Авторизация: базовый foobar», и я получил 200 OK-ответ от весны.

Теперь я отправляю запрос на получение 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;
    }
}
...