SpringSecurity退出功能实现的正确方式

file

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

1、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做为请求登出的路径。spring

<a href="/logout" >退出</a>

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

2、默认的logout作了什么?

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

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

一般对于一个应用来说,以上动做就是logout功能所须要具有的功能了。session

3、个性化配置

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

http.logout()
     .logoutUrl("/signout")
     .logoutSuccessUrl("/aftersignout.html")
     .deleteCookies("JSESSIONID")
  • 经过指定logoutUrl配置改变退出请求的默认路径,固然html退出按钮的请求url也要修改
  • 经过指定logoutSuccessUrl配置,来显式指定退出以后的跳转页面
  • 还可使用deleteCookies删除指定的cookie,参数为cookie的名称

4、LogoutSuccessHandler

若是上面的个性化配置,仍然知足不了您的应用需求。可能您的应用须要在logout的时候,作一些特殊动做,好比登陆时长计算,清理业务相关的数据等等。你能够经过实现LogoutSuccessHandler 接口来实现你的业务逻辑。ssh

@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将失效。ide

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

期待您的关注

相关文章
相关标签/搜索