2013-09-23 20 views
8

Tôi có một cấu hình mùa xuân cho logout như sau:Làm thế nào để thực hiện logout Programatically vào mùa xuân 3

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

Bây giờ tôi muốn làm programatically logout. Làm thế nào tôi có thể đạt được điều này trong mùa xuân 3. Tôi cần phải đăng xuất từ ​​một trong những bộ điều khiển của tôi có def sau đây. và hiện tại tôi đang làm điều gì đó như sau ... Đây có phải là ý tưởng hay không ..

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

Chuyển hướng sẽ hoạt động nhưng tại sao không chỉ thêm 'HttpSevletRequest' làm tham số và gọi phương thức' logout'. (Sẽ chỉ làm việc trong môi trường Servlet 3.0 với Spring Security 3.2 (hiện tại đang trong RC1) –

Trả lời

16

Tùy theo. Nếu ứng dụng của bạn có thể đặt người dùng đã đăng xuất trên trang "bạn đã đăng xuất" thì điều này có thể được chấp nhận. Nhưng bạn không thể chắc chắn liệu người dùng của mình có thực sự bị đăng xuất hay không (ví dụ: nếu trình duyệt đang chặn chuyển hướng).

lập trình bạn có thể thoát ra theo cách này:

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); 
    } 

Như @LateralFractal chỉ ra, nếu bạn chưa thay đổi giá trị mặc định của SecurityContextLogoutHandler (xem https://github.com/spring-projects/spring-security/blob/3.2.x/web/src/main/java/org/springframework/security/web/authentication/logout/SecurityContextLogoutHandler.java#L96), bạn có thể cắt này xuống

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

hoặc thậm chí (mặc dù đó là một chút xấu xí)

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

Xem https://stackoverflow.com/a/9767869/1686330 để biết một số thông tin cơ bản về cách nhận được HttpServletRequest.

+0

Thay thế, 'new SecurityContextLogoutHandler(). Logout (request, null, null)' sẽ làm điều tương tự nếu mặc định xử lý vẫn áp dụng – LateralFractal

+0

@LateralFractal Cảm ơn bạn đã chỉ ra điều này. Đã thay đổi câu trả lời của tôi. –

Các vấn đề liên quan