SpringSecurity退出登錄功能

接上篇token校驗(yàn),現(xiàn)在實(shí)現(xiàn)一下退出登錄的功能

Controller層

    @PostMapping("/logout")
    public Result logout(){
        return LoginService.logout();
    }

Service層

退出登錄的本質(zhì)就是要?jiǎng)h除redis中緩存的用戶信息,因?yàn)檎{(diào)接口就必須攜帶token,就會(huì)走認(rèn)證過(guò)濾器的流程,如果redis中沒(méi)有對(duì)應(yīng)的用戶信息,那么token就是無(wú)效的。

我們要獲取userId,然后根據(jù)userId刪除redis中的緩存,那么就用SecurityContextHolder來(lái)獲取userId。 SecurityContextHolder底層是用ThreadLocal實(shí)現(xiàn)的,也就說(shuō)明同一個(gè)線程里都可以訪問(wèn)到之前在過(guò)濾器里面存儲(chǔ)到SecurityContextHolder里的用戶對(duì)象。

@Override
    public Result logout() {
        //1、獲取token,解析出userId
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        LoginUser loginUser = (LoginUser) authentication.getPrincipal(); //強(qiáng)轉(zhuǎn)
        Long userId = loginUser.getUser().getId();
        //2、刪除redis中緩存的用戶信息
        redisCache.deleteObject("login:"+userId);
        return Result.okResult();
    }
最后別忘了在SecurityConfig配置類(lèi)里加上http.antMatchers("/logout").authenticated()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容