Невозможно выйти из системы с помощью Spring Security 5 - PullRequest
0 голосов
/ 12 октября 2018

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

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

@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 getтокен сеанса из локального хранилища браузера.

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

ngOnInit() {
    this.login.checkSession().subscribe(
      res=>{
        this.loggedIn=true;
      },
      err=>{
        console.log(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.log(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.log(err);
        }
    )
  }

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

1 Ответ

0 голосов
/ 12 октября 2018

Spring 100 поддерживает функцию logout из коробки, просто требуется некоторая конфигурация:

@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 doc

...