Клиентская проверка подлинности на основе файлов cookie с помощью Spring Security - PullRequest
0 голосов
/ 18 января 2019

У нас есть полностью работающий внутренний 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)
  }
}

1 Ответ

0 голосов
/ 19 января 2019

Использование JWT (Jason Web Tokens) - отличный способ реализовать безопасность в одностраничных приложениях, таких как React.

Если вы используете подход JWT, было бы эффективно использовать такой пакет, как axios, для запросов http со стороны клиента. Axios позволяет без проблем добавлять токен авторизации для всех запросов.

Даже если вы не используете JWT, попробуйте использовать axios для эффективной отправки токенов авторизации.

...