spring security 入门教程 登出logout

今天聊一聊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的教程到我主页上面查看

你可能感兴趣的:(spring security 入门教程 登出logout)