2013-09-23 3 views
8

У меня есть конфигурация пружины для выхода из системы, как следует:Как выполнить выход из системы Programatically весной 3

<logout logout-url="/abc/logout" 
      logout-success-url="/abc/login"/> 

Теперь я хочу сделать программно выход из системы. Как я могу достичь этого весной 3. Мне нужно сделать выход из одного из моих контроллеров, который имеет следующий def. и в настоящее время я делаю что-то вроде следующего ... Это хорошая идея.

public void suppressUserProfile() { 
    //... 
    return "redirect:/abc/logout"; 
} 
+0

Редирект будет работать, но почему бы просто не добавить параметр «HttpSevletRequest» в качестве параметра и вызвать метод «logout». (Будет работать только в среде Servlet 3.0 с Spring Security 3.2 (которая в настоящее время находится в RC1). –

ответ

16

Это зависит. Если это нормально для вашего приложения, чтобы поместить выведенного из системы пользователя на странице «вы вышли из системы», это может быть нормально. Но вы не можете быть уверены, что ваш пользователь действительно выйдет из системы (например, если браузер подавляет перенаправление).

Программным вы можете выйти так:

public void logout(HttpServletRequest request, HttpServletResponse response) { 
     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
      if (auth != null){  
      new SecurityContextLogoutHandler().logout(request, response, auth); 
      } 
     SecurityContextHolder.getContext().setAuthentication(null); 
    } 

Как @LateralFractal отметил, если вы не изменили значения по умолчанию из SecurityContextLogoutHandler (см https://github.com/spring-projects/spring-security/blob/3.2.x/web/src/main/java/org/springframework/security/web/authentication/logout/SecurityContextLogoutHandler.java#L96) вы можете сократить это до

public void logout(HttpServletRequest request) { 
    new SecurityContextLogoutHandler().logout(request, null, null); 
} 

или даже (хотя это немного некрасиво)

public void logout() { 
    HttpServletRequest request = 
     ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()) 
      .getRequest(); 
    new SecurityContextLogoutHandler().logout(request, null, null); 

См. https://stackoverflow.com/a/9767869/1686330 для получения некоторого фона при получении HttpServletRequest.

+0

Альтернативно, новый SecurityContextLogoutHandler(). Logout (request, null, null) 'будет делать то же самое, если по умолчанию используются по умолчанию обработчики – LateralFractal

+0

@LateralFractal Спасибо, что указали это. Изменен мой ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^