Невозможно выйти из системы с помощью Spring Security 5

Я хочу создать административный портал для управления книгами (получение, добавление, удаление, обновление книги). Итак, я начал с функции входа / выхода; часть входа в систему работает как шарм, но у меня возникла проблема с выходом из системы. Когда я выхожу из системы, портал администратора поддерживает сеанс и не убивает его, и я не могу получить в журнале никаких ошибок, подтверждающих эту проблему.

Ниже фрагмент кода, который отвечает на почтовый запрос на выход из системы:

@RequestMapping(value = "/user/logout", method = RequestMethod.POST)
    public ResponseEntity logout(HttpServletRequest request, HttpServletResponse response) {
        SecurityContextHolder.clearContext();

        return new ResponseEntity("Logout Successful !", HttpStatus.OK);
    }

В клиенте я использую Angular для отправки почтового запроса на мой локальный сервер. Ниже службы выхода из системы:

logout(){
    let url = "http://localhost:8090/user/logout";
    const xToken = localStorage.getItem('xAuthToken');
    let headers=new Headers({
      'x-auth-token':xToken,
    });

    return this.http.post(url,{headers:headers});
  }

Переменная xToken получает токен сеанса из локального хранилища браузера.

Каждый раз, когда мы проверяем, сохраняется ли сессия в ngOnInit компонента входа в систему:

ngOnInit() {
    this.login.checkSession().subscribe(
      res=>{
        this.loggedIn=true;
      },
      err=>{
        console.info(err);
        this.loggedIn=false;
      }
    )
  }

Сервис, отвечающий за проверку сеанса, подробно описан ниже:

checkSession(){
    let url = "http://localhost:8090/checkSession";
    const xToken = localStorage.getItem('xAuthToken');
    const basicHeader = 'Basic ' + localStorage.getItem('credentials');
    let headers=new Headers({
      'x-auth-token':xToken,
      'Authorization':basicHeader
    });

    return this.http.get(url,{headers:headers});
  }

Для проверки сеанса мы запрашиваем сервер:

@RequestMapping("/checkSession")
    public ResponseEntity checkSession() {
        System.out.print("Session Active !");
        return new ResponseEntity("Session Active !", HttpStatus.OK);
    }

Константа basicHeader - это схема аутентификации, которая содержит закодированную комбинацию имени пользователя и пароля, хранящуюся в локальном хранилище браузера.

для получения дополнительной информации ниже, как мы отправляем учетные данные на сервер:

onSubmit(){
    this.login.sendCredentials(this.credentials.username,this.credentials.password).subscribe(
        res=>{
          console.info(res);
          localStorage.setItem('xAuthToken', res.json().token);
          this.loggedIn=true;
          const encodedCredentials = btoa(this.credentials.username + ':' + this.credentials.password);
          localStorage.setItem("credentials",encodedCredentials);
          location.reload();
        },err=>{
          console.info(err);
        }
    )
  }

Пожалуйста, любая помощь очень ценится. Заранее благодарим за решение этой проблемы

почему вы не вызываете просто выход из системы? я имею в виду '/ выход из системы'

Asanka 12.10.2018 20:58

когда я вызываю просто '/ logout', он показывает мне ошибку «локальный: 4200 / войти? выйти 404 not found», я думаю, это связано с формальностью весенней безопасности при использовании почтового запроса

Mohamed Aoutir 12.10.2018 21:17
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
3
2
1 475
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция logout поддерживается Spring Security из коробки, для этого просто требуется некоторая настройка:

@EnableWebSecurity
@Configuration
public class SecurityConf extends WebSecurityConfigurerAdapter {

   @Override
   public void configure(HttpSecurity http) {

       http
           .httpBasic().and() // HTTP Basic authorization or whichever
           .authorizeRequests()
           .antMatchers(...).permitAll()
           .anyRequest().authenticated().and()
           ...
           .logout();
   }

   ...
}

Затем метод /logout доступен на http://localhost:8080/logout через метод POST, если ваше приложение запущено на localhost через порт 8080.

Подробнее Документ Spring Security

@WilDev Я добавляю эту конфигурацию, но она не работает. Я думаю, мне следует добавить некоторые функции в общедоступный ResponseEntity logout () контроллера отдыха, чтобы аннулировать текущий активный сеанс.

Mohamed Aoutir 13.10.2018 15:12

@MohamedAoutir, метод предоставляется Spring Security, ручная реализация не требуется. Прямой запрос POST к конечной точке http://localhost:8090/logout должен помочь

WildDev 13.10.2018 16:01

@Wildev, когда я выхожу из системы, я очищаю хранилище браузера в клиенте, набирая localstorage.clear (), и у меня это работает.

Mohamed Aoutir 13.10.2018 19:47

Я наблюдаю такое же поведение: мой контроллер выхода из системы НЕ вызывается, и файл cookie CAS не очищается. Я могу войти в систему только как тот же пользователь, пока не удалю этот файл cookie. Я не могу войти под другим именем.

Marvo 11.05.2019 18:37

Другие вопросы по теме