Spring Security Logout

1. 概述

本文建立在我们的表单登录教程之上,将重点关注如何使用 Spring Security 配置注销

2. 基本配置

使用logout()方法的Spring Logout 功能的基本配置非常简单:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
          //...
          .logout()
          //...
   }
   //...
}

和 XML 版本:

<http>

    ...    
    <logout/>

</http>

该元素启用默认注销机制——配置为使用以下注销 url:/logout. 在Spring Security 4之前是 /j_spring_security_logout

3. JSP 和 注销链接

继续这个简单的例子,在 Web 应用程序中提供注销链接的方法是:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
   <head></head>
   <body>
      <a href="<c:url value="/logout" />">Logout</a>
   </body>
</html>

4. 高级定制

4.1. logoutSuccessUrl()

注销过程执行成功后,Spring Security 会将用户重定向到指定页面。默认情况下,这是根页面(“/”),但这是可配置的:

//...
.logout()
.logoutSuccessUrl("/afterlogout.html")
//...

这也可以使用 XML 配置来完成:

<logout logout-success-url="/afterlogout.html" />

根据应用程序,一个好的做法是将用户重定向回登录页面:

//...
.logout()
.logoutSuccessUrl("/login.html")
//...

4.2. logoutUrl()

与 Spring Security 中的其他默认值类似,实际触发注销机制的 URL 也有一个默认值 - /logout

然而,改变这个默认值是一个好主意,以确保没有发布关于使用什么框架来保护应用程序的信息:

.logout()
.logoutUrl("/perform_logout")

和 XML 版本:

<logout 
  logout-success-url="/anonymous.html" 
  logout-url="/perform_logout" />

4.3. invalidateHttpSession 和 deleteCookies

这两个高级属性控制会话失效,以及在用户注销时要删除的cookie列表。因此,invalidateHttpSession允许设置会话,以便在注销发生时它不会失效(默认情况下为true)。

deleteCookies 方法也很简单:

.logout()
.logoutUrl("/perform_logout")
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")

和 XML 版本:

<logout 
  logout-success-url="/anonymous.html" 
  logout-url="/perform_logout"
  delete-cookies="JSESSIONID" />

4.4. logoutSuccessHandler()

对于更高级的场景,命名空间不够灵活,可以用自定义引用替换 Spring 上下文中的LogoutSuccessHandler bean:

@Bean
public LogoutSuccessHandler logoutSuccessHandler() {
    return new CustomLogoutSuccessHandler();
}

//...
.logout()
.logoutSuccessHandler(logoutSuccessHandler());
//...

等效的 XML 配置是:

<logout 
  logout-url="/perform_logout"
  delete-cookies="JSESSIONID"
  success-handler-ref="customLogoutSuccessHandler" />

...
<beans:bean name="customUrlLogoutSuccessHandler" />

任何需要在用户成功注销时运行的自定义应用程序逻辑都可以使用自定义注销成功处理程序来实现。例如——一个简单的审计机制跟踪用户在触发注销时所在的最后一页:

public class CustomLogoutSuccessHandler extends 
  SimpleUrlLogoutSuccessHandler implements LogoutSuccessHandler {

    @Autowired 
    private AuditService auditService; 

    @Override
    public void onLogoutSuccess(
      HttpServletRequest request, 
      HttpServletResponse response, 
      Authentication authentication) 
      throws IOException, ServletException {
 
        String refererUrl = request.getHeader("Referer");
        auditService.track("Logout from: " + refererUrl);

        super.onLogoutSuccess(request, response, authentication);
    }
}

📝注意: 此自定义 bean 有责任确定用户在注销后被定向到的目的地。因此,将logoutSuccessHandler属性与logoutSuccessUrl配对是行不通的,因为两者都包含相似的功能。

5. 结论

在此示例中,我们首先使用 Spring Security 设置一个简单的注销示例,然后我们讨论了更高级的可用选项。

这个 Spring Logout 教程的实现可以在GitHub 项目中找到——这是一个基于 Eclipse 的项目,所以应该很容易导入和运行。

当项目在本地运行时,可以在以下位置访问示例 HTML:

http://localhost:8080/spring-security-mvc-login/login.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值