У меня есть угловой фронтэнд и пружинный бэкэнд. Я использую 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;
}
}