У нас есть полностью работающий внутренний POST-сервис входа в систему, реализованный с использованием Spring Security, а также Spring Boot и Spring Session.Пользователь должен войти в систему для доступа к другим услугам.Операция входа в систему работает, как и механизм ограничения / разрешения доступа к другим службам.Это было проверено на Postman, который «достаточно умен», чтобы сохранять cookie-файлы сеанса для последовательных запросов.
Теперь мы пытаемся построить клиент на React.При использовании отладки браузера мы видим, что cookie-файл сеанса отправляется в заголовке ответа без проблем.Мы пытались получить сессионный cookie из заголовка и сохранить его для последующих запросов, но он не работает.При исследовании мы узнали , мы не должны читать заголовок ответа из кода , как объяснено здесь и здесь .
Наша операция входа в системуследует перенаправить в / customer / home, который работает в Postman, но не в нашем приложении.Поведение, которое мы получаем с этим, является 403 Запрещенным, и способ, которым мы оцениваем его, состоит в том, что cookie не устанавливается при перенаправлении, и, следовательно, вторая операция (GET / customer / home) завершается неудачно и возвращает 403. Насколько наше понимание верно?Однако браузер, похоже, не сохраняет cookie-файл сессии автоматически.Как мы должны поддерживать сеанс для последующих запросов, если cookie не устанавливается автоматически, и мы не должны читать его вручную?Разве мы не должны использовать куки для этой цели и вместо этого выдавать токены аутентификации?
Очевидно, что мы что-то неправильно понимаем или что-то упустили.Любые указатели, пожалуйста?
Наш WebSecurityConfigurerAdapter:
@EnableWebSecurity
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AuthenticationProviderService authenticationProviderService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/customer/register").permitAll()
.anyRequest().fullyAuthenticated()
.and()
.formLogin()
.permitAll()
.defaultSuccessUrl("/customer/home", false)
.and()
.logout()
.permitAll()
.and()
.httpBasic();
http.csrf().disable();
}
//[ . . . ]
}
Наш клиент пытается сделать POST:
const mw = store => next => action => {
if(action.type == 'SUBMIT_LOGIN_USER') {
var payload = {
username: action.user.username,
password: action.user.password
};
// Build formData object.
let formData = new FormData();
formData.append('username', action.user.username);
formData.append('password', action.user.password);
return fetch('http://192.168.0.34:8080/login', {
method: 'POST',
body: formData
}).then(
r => (r)
)
.then(function(response) {
console.log(document.cookie) //empty
console.log(response.headers.get('Set-Cookie')) //null
next(action)
})
.catch(function(err) {
console.info(err);
});
} else {
next(action)
}
}