Я защищаю свой REST API с помощью Basic-Auth.Я узнал, что для API без сохранения состояния серверная часть должна отправлять файл cookie (с обоими флагами httpOnly
и secure
) для базовой аутентификации, который затем будет добавляться к каждому запросу.Вот мои вопросы:
- Каким должно быть имя этого файла cookie?
- Как установить файл 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-адрес, защищенный базовой аутентификацией. Если пользователь предоставляет правильные учетные данные, он отправляет cookie-файл аутентификации с ответом.
Кроме того, я понятия не имею,где получить пароль для этого текущего пользователя.
ОБНОВЛЕНИЕ : мне удалось добавить куки-файл в ответ, используя приведенное ниже:
@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
заголовок из этого cookie в request
как Basic xxxxxxx=
.