spring security 入门教程 登出logout

今天聊一聊spring security登出相关的话题。相对于登陆,登出功能的使用和配置就相对简单一些。

项目准备

我在上一篇文章,搭建了一个很基础的环境。里面有一个受保护的restful api,然后就是一些登陆的配置。今天我们接着这个项目来说一说这个logout功能。

开工

首先我们项目里面现在有一个登陆页面/demo-login.html,我们现在需要写一个首页,至少得让我们的登出功能有个地方放吧。

我们在\src\main\resources\resources路径下新建一个index.html文件

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
</head>

<body>

    <form action="/logout">
        <button type="submit">登出</button>
    </form>
    
    <button onclick="logout()">登出</button>

</body>

<script>
    
    function logout() {
        $.ajax('/logout', {
            method: 'post',
            success() {
                console.log('登出成功');
            }
        });
    }
    
</script>
</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的教程到我主页上面查看

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容