今天聊一聊spring security登出相关的话题。相对于登陆,登出功能的使用和配置就相对简单一些。
项目准备
我在上一篇文章,搭建了一个很基础的环境。里面有一个受保护的restful api,然后就是一些登陆的配置。今天我们接着这个项目来说一说这个logout功能。
开工
首先我们项目里面现在有一个登陆页面/demo-login.html
,我们现在需要写一个首页,至少得让我们的登出功能有个地方放吧。
我们在\src\main\resources\resources
路径下新建一个index.html
文件
首页
页面之中访问了一个/logout
接口,这个接口是spring security默认的登出地址,后面我们可以自己去设置这个地址的。
这个文件新建完成之后,我们启动项目,访问刚新建的这个页面localhost:8080/index.html
,这里是我项目里面的地址,你们自己换成你们自己的地址。
因为我们还没有登录,所以访问这个index
页面的时候spring security会把我们引导到我们的登录页/demo-login.html
,登录成功之后会转到index
页面
现在我们点击第一个登出按钮页面会自动跳转到登录页面,登出成功了。再次登录到index页面尝试点击一下第二个登出按钮,控制台会打印出登出成功,但是页面没有反应,我们刷新一下之后会发现也跳转到登录页,说明登出也成功了。
登出这个功能其实spring security默认帮我们配置好了,我们现在已经尝试过怎么使用了。现在就遗留一些问题,我们来解决一下。
配置登出接口地址
刚才我们在项目中使用的是默认的登出地址/logout
,我们想使用其他的地址可不可以呢?答案是肯定的。只需要简单的配置一下spring security即可。接着上一个项目的配置,我整体的贴一下配置。
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/demo-login.html")
.loginProcessingUrl("/demo-login")
.and()
//登出的配置
.logout()
.logoutUrl("/demo-logout")
.and()
.authorizeRequests()
.antMatchers("/demo-login.html", "/demo-login").permitAll()
.anyRequest().authenticated()
.and()
.csrf().disable();
}
这里需要注意的是csrf防护需要关闭,如果不关闭csrf的话登出功能只支持post方法,且需要带上csrf token。关于csrf防护相关的东西我之后会写一篇文章专门讲一下这个东西。
配置登出成功跳转的地址
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/demo-login.html")
.loginProcessingUrl("/demo-login")
.and()
//登出的配置
.logout()
.logoutUrl("/demo-logout")
.logoutSuccessUrl("/demo-login.html")
.and()
.authorizeRequests()
.antMatchers("/demo-login.html", "/demo-login").permitAll()
.anyRequest().authenticated()
.and()
.csrf().disable();
}
配置登出成功后的自定义逻辑
我们可能需要在用户登出成功之后做一些业务操作,spring security把登出成功之后的逻辑封装到LogoutSuccessHandler
接口之中。我们首先需要实现这个接口。
@Component
public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler {
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
System.out.println(String.format("用户%s成功登出,恭喜!", ((User)authentication.getPrincipal()).getUsername()));
response.sendRedirect("/demo-login.html");
}
}
在onLogoutSuccess
这个方法里面实现你自己的业务逻辑。
然后再配置一下spring security即可。
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final LogoutSuccessHandlerImpl logoutSuccessHandler;
public SecurityConfig(LogoutSuccessHandlerImpl logoutSuccessHandler) {
this.logoutSuccessHandler = logoutSuccessHandler;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/demo-login.html")
.loginProcessingUrl("/demo-login")
.and()
//登出的配置
.logout()
.logoutUrl("/demo-logout")
.logoutSuccessUrl("/demo-login.html")
.logoutSuccessHandler(logoutSuccessHandler)
.and()
.authorizeRequests()
.antMatchers("/demo-login.html", "/demo-login").permitAll()
.anyRequest().authenticated()
.and()
.csrf().disable();
}
}
这样配置好就可以了。登出成功会进入到你自己定义的方法里面。
结束
更多spring security的教程到我主页上面查看