Как добавить куки аутентификации в ответ REST API, используя Spring Security?
Я защищаю свой REST API с помощью Basic-Auth. Я узнал, что для API без сохранения состояния серверная часть должна отправлять куки (с обоими httpOnly
и secure
флаг) для базовой аутентификации, которая затем будет добавляться к каждому запросу. Вот мои вопросы:
- Какое имя должно быть у этого куки?
- Как установить cookie?
- Как уровень безопасности Spring идентифицирует и извлекает закодированные в Base64 учетные данные из этого файла cookie?
В настоящее время это моя конфигурация безопасности:
@Override
protected void configure(HttpSecurity http) throws Exception {// @formatter:off
http
.cors()
.and().authorizeRequests()
.antMatchers("/signup/**").permitAll()
.anyRequest().authenticated()
.and().httpBasic()
.and().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().csrf().disable()
;
// @formatter:off
}
Поскольку я понятия не имею, как установить cookie для аутентификации, я попробовал это:
@Controller
@RequestMapping("/login")
public class AuthController {
@GetMapping
@ResponseStatus(value=HttpStatus.OK)
public void loginUser( final HttpServletResponse response) {
response.addCookie(new Cookie("something", "value"));
}
}
http://localhost:8080/login
является URL-адресом, защищенным базовой аутентификацией. Если пользователь предоставляет правильные учетные данные, он отправляет куки-файл аутентификации с ответом
Кроме того, я не знаю, где можно получить пароль для этого текущего пользователя.
ОБНОВЛЕНИЕ: мне удалось добавить куки в ответ, используя ниже:
@GetMapping
@ResponseStatus(value=HttpStatus.OK)
public void loginUser( final HttpServletRequest request ,final HttpServletResponse response) throws UnsupportedEncodingException {
setAuthCookieToResonse(request,response);
}
private void setAuthCookieToResonse(final HttpServletRequest request ,final HttpServletResponse response) throws UnsupportedEncodingException {
String cookieKey = "auth";
String cookieValue = request.getHeader("Authorization");
if (cookieValue != null) {
Cookie cookie = new Cookie(cookieKey, cookieValue);
cookie.setHttpOnly(true);
response.addCookie(cookie);
}
}
Итак, теперь основная идея такова: с каждым запросом этот куки будет отправляться. Это уменьшает дополнительные затраты на добавление Authorization
заголовок интерфейсным приложением.
Теперь единственная оставшаяся часть: так как к каждому запросу будет прикреплен файл cookie авторизации, мне нужно каким-то образом извлечь этот файл cookie из request
и передать его BasicAuthenticationFilter
таким образом, что Spring-Security может извлечь имя пользователя и пароль из этого файла cookie.
Моя идея: создать фильтр (как показано ниже) и извлечь учетные данные из cookie
затем добавьте Authorization
Заголовок из этого куки в request
лайк Basic xxxxxxx=
,