SpringSecurity退出功能实现的正确方式(推荐)

 更新时间:2019年11月25日 08:28:46   作者:字母哥博客  
本文将介绍在Spring Security框架下如何实现用户的"退出"logout的功能。本文通过实例代码讲解的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧

spring security 简介

        spring security 的核心功能主要包括:

  • 认证 (你是谁)
  • 授权 (你能干什么)
  • 攻击防护 (防止伪造身份)

     其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。

本文将介绍在Spring Security框架下如何实现用户的"退出"logout的功能。其实这是一个非常简单的功能,我见过很多的程序员在使用了Spring Security之后,仍然去自己写controller方法实现logout功能,这种做法就好像耕地,你有机械设备你不用,你非要用牛。

一、logout最简及最佳实践

其实使用Spring Security进行logout非常简单,只需要在spring Security配置类配置项上加上这样一行代码:http.logout()。关于spring Security配置类的其他很多实现、如:HttpBasic模式、formLogin模式、自定义登录验证结果、使用权限表达式、session会话管理,在本号的之前的文章已经都写过了。本节的核心内容就是在原有配置的基础上,加上这样一行代码:http.logout()。

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(final HttpSecurity http) throws Exception {
    http.logout();
  }
}

加上logout配置之后,在你的“退出”按钮上使用/logtou作为请求登出的路径。

<a href="/logout" rel="external nofollow" >退出</a>

logout功能我们就完成了。实际上的核心代码只有两行。

二、默认的logout做了什么?

虽然我们简简单单的实现了logout功能,是不是还不足够放心?我们下面就来看一下Spring Security默认在logout过程中帮我们做了哪些动作。

  • 当前session失效,即:logout的核心需求,session失效就是访问权限的回收。
  • 删除当前用户的 remember-me“记住我”功能信息
  • clear清除当前的 SecurityContext
  • 重定向到登录页面,loginPage配置项指定的页面

通常对于一个应用来讲,以上动作就是logout功能所需要具备的功能了。

三、个性化配置

虽然Spring Security默认使用了/logout作为退出处理请求路径,登录页面作为退出之后的跳转页面。这符合绝大多数的应用的开发逻辑,但有的时候我们需要一些个性化设置,如下:

 http.logout()
   .logoutUrl("/signout")
   .logoutSuccessUrl("/aftersignout.html")
   .deleteCookies("JSESSIONID")

  • 通过指定logoutUrl配置改变退出请求的默认路径,当然html退出按钮的请求url也要修改
  • 通过指定logoutSuccessUrl配置,来显式指定退出之后的跳转页面
  • 还可以使用deleteCookies删除指定的cookie,参数为cookie的名称

四、LogoutSuccessHandler

如果上面的个性化配置,仍然满足不了您的应用需求。可能您的应用需要在logout的时候,做一些特殊动作,比如登录时长计算,清理业务相关的数据等等。你可以通过实现LogoutSuccessHandler 接口来实现你的业务逻辑。

@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
  
  @Override
  public void onLogoutSuccess(HttpServletRequest request, 
                HttpServletResponse response, 
                Authentication authentication) 
                throws IOException, ServletException {
    //这里书写你自己的退出业务逻辑
    
    // 重定向到登录页
    response.sendRedirect("/login.html");
  }
}

然后进行配置使其生效,核心代码就是一行logoutSuccessHandler。注意logoutSuccessUrl不要与logoutSuccessHandler一起使用,否则logoutSuccessHandler将失效。

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
  
@Autowired
  private MyLogoutSuccessHandler myLogoutSuccessHandler;

  @Override
  protected void configure(final HttpSecurity http) throws Exception {
     http.logout()
       .logoutUrl("/signout")
       //.logoutSuccessUrl(``"/aftersignout.html"``)
       .deleteCookies("JSESSIONID")
       //自定义logoutSuccessHandler
       .logoutSuccessHandler(myLogoutSuccessHandler);  
  }
}

总结

以上所述是小编给大家介绍的SpringSecurity退出功能实现的正确方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • javamail实现注册激活邮件

    javamail实现注册激活邮件

    这篇文章主要为大家详细介绍了javamail实现注册激活邮件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java map.getOrDefault()方法的用法详解

    Java map.getOrDefault()方法的用法详解

    这篇文章主要介绍了Java map.getOrDefault()方法的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Spring Boot 集成Shiro的多realm配置过程

    Spring Boot 集成Shiro的多realm配置过程

    这篇文章主要介绍了Spring Boot 集成Shiro的多realm配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java中图像锐化操作的方法详解

    Java中图像锐化操作的方法详解

    这篇文章主要给大家介绍了关于Java中图像锐化操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Hibernate悲观锁和乐观锁实例详解

    Hibernate悲观锁和乐观锁实例详解

    这篇文章主要介绍了Hibernate悲观锁和乐观锁实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • struts升级到2.5.2遇到的问题及解决方案(推荐)

    struts升级到2.5.2遇到的问题及解决方案(推荐)

    原来的版本是2.3.x,由于安全原因需要升级到2.5.2。但是在升级过程中遇到各种各样的问题,下面小编给大家带来了struts升级到2.5.2遇到的问题及解决方案,需要的朋友参考下吧
    2016-11-11
  • 如何解决java:找不到符号符号:类__(使用了lombok的注解)

    如何解决java:找不到符号符号:类__(使用了lombok的注解)

    在使用IntelliJ IDEA开发Java项目时,可能遇到通过@lombok注解自动生成get和set方法不生效的问题,解决这一问题需要几个步骤,首先,确认Lombok插件已在IDEA中安装并启用,其次,确保项目中已添加Lombok的依赖,对于Maven和Gradle项目
    2024-10-10
  • SpringBoot获取application.properties文件中文乱码问题及解决

    SpringBoot获取application.properties文件中文乱码问题及解决

    这篇文章主要介绍了SpringBoot获取application.properties文件中文乱码问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • springboot实现多模块项目添加一新模块

    springboot实现多模块项目添加一新模块

    这篇文章主要介绍了springboot实现多模块项目添加一新模块,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 关于SpringMVC中数据绑定@ModelAttribute注解的使用

    关于SpringMVC中数据绑定@ModelAttribute注解的使用

    这篇文章主要介绍了关于SpringMVC中数据绑定@ModelAttribute注解的使用,SpringMVC是一个基于Spring框架的Web框架,它提供了一种简单、灵活的方式来开发Web应用程序,在开发Web应用程序时,我们需要将用户提交的数据绑定到我们的Java对象上,需要的朋友可以参考下
    2023-07-07

最新评论