Как добавить куки аутентификации в ответ REST API, используя Spring Security? - PullRequest
0 голосов
/ 06 февраля 2019

Я защищаю свой REST API с помощью Basic-Auth.Я узнал, что для API без сохранения состояния серверная часть должна отправлять файл cookie (с обоими флагами httpOnly и secure) для базовой аутентификации, который затем будет добавляться к каждому запросу.Вот мои вопросы:

  1. Каким должно быть имя этого файла cookie?
  2. Как установить файл cookie?
  3. Как уровень безопасности 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=.

...