最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于SpringSecurity?Context?中獲取和更改當(dāng)前用戶信息的問(wèn)題

 更新時(shí)間:2024年09月11日 16:12:48   作者:零offer在手  
SpringSecurityContext在異步線程中無(wú)法獲取用戶信息,因其與請(qǐng)求線程綁定;此外,用戶信息更新后跳轉(zhuǎn)頁(yè)面時(shí),身份會(huì)被降級(jí)為匿名,導(dǎo)致信息無(wú)法及時(shí)同步,本文給大家介紹SpringSecurity?Context?中獲取和更改當(dāng)前用戶信息的問(wèn)題,感興趣的朋友一起看看吧

SpringSecurity Context 獲取和更改用戶信息的問(wèn)題

SecurityContext 異步線程中獲取用戶信息

今天在做項(xiàng)目時(shí)遇到了一個(gè)問(wèn)題,我需要獲取當(dāng)前用戶的 ID。之前,前端并沒(méi)有存儲(chǔ)用戶信息,我一直是在后端的 service 中通過(guò) SecurityContext 來(lái)獲取用戶信息,這個(gè)方法之前一直有效。然而,今天在另一個(gè) service 中調(diào)用時(shí)卻無(wú)法獲取到用戶信息。

經(jīng)過(guò)詳細(xì)排查,發(fā)現(xiàn) SecurityContext 的內(nèi)容是與請(qǐng)求線程(如 HTTP 請(qǐng)求)綁定的。但我當(dāng)前的 service 是用于處理 MQTT 消息,這屬于異步線程。因此,在異步線程中無(wú)法從 SecurityContext 獲取用戶信息,只能另尋解決方案。

 /**
     * 處理接收到的設(shè)備數(shù)據(jù),根據(jù)數(shù)據(jù)類型進(jìn)行不同的處理。energy數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù),其他數(shù)據(jù)通過(guò)WebSocket發(fā)送到前端展示。
     * @param data 數(shù)據(jù)內(nèi)容
     */
    private void handleIncomingData(String data) {
        	......
            /*
                * 通過(guò)設(shè)備ID找到用戶ID, 不能通過(guò)securityContext獲取當(dāng)前用戶ID,因?yàn)檫@里是異步處理消息,不在請(qǐng)求線程中。
                * 通過(guò)securityContext獲取當(dāng)前用戶ID的方法只能在請(qǐng)求線程中使用,通常是與HTTP請(qǐng)求相關(guān)的操作才能獲取到。
                * 這里是MQTT消息處理,不在請(qǐng)求線程中,所以要通過(guò)其他方式獲取當(dāng)前用戶ID。
                * 還因?yàn)檫@里是存入數(shù)據(jù)庫(kù),因?yàn)橐膊荒芤蕾囄锢碓O(shè)備的用戶ID,設(shè)備不一定是存用戶ID, 降低耦合性。
               TODO: 這里是否可以改進(jìn)?
             */
            long userId = deviceMapper.findDeviceById(deviceId).getUserId();
            if (userId<=0) {//如果userId<=0,說(shuō)明沒(méi)有找到對(duì)應(yīng)的設(shè)備
                logger.error("Failed to get user id by device id: {}", deviceId);
                throw new RuntimeException("Failed to get user id by device id: " + deviceId);
            }
            Energy energy = new Energy();
            energy.setDeviceId(deviceId);
            energy.setEnergy(totalEnergy);
            energy.setRecordDate(recordDate);
            energy.setUserId(userId);
			......
    }

SecurityContext 線程降級(jí)問(wèn)題

在項(xiàng)目中遇到 SecurityContext 線程降級(jí)的問(wèn)題,具體場(chǎng)景是用戶修改個(gè)人資料(如郵箱)后,我希望 SecurityContext 中的用戶信息能及時(shí)更新。然而,在修改郵箱后,用戶需要跳轉(zhuǎn)到郵箱驗(yàn)證碼驗(yàn)證頁(yè)面,該頁(yè)面通過(guò) security 配置中的 permitAll() 允許匿名訪問(wèn)。

這個(gè)配置導(dǎo)致一個(gè)問(wèn)題:雖然用戶已經(jīng)登錄認(rèn)證,但在訪問(wèn) /verify-code 頁(yè)面時(shí),SecurityContext 中的身份會(huì)被降級(jí)為匿名用戶,進(jìn)而導(dǎo)致更新后的信息沒(méi)有在 SecurityContext 中及時(shí)反映。

我了解到可以通過(guò) setAuthentication() 手動(dòng)更新 SecurityContext,但嘗試后依然無(wú)法解決問(wèn)題,更新后的用戶信息仍舊無(wú)法及時(shí)同步到 SecurityContext 中~

   @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf(AbstractHttpConfigurer::disable) // disable csrf
                .authorizeHttpRequests(authorize -> authorize
                        .requestMatchers("/login","/register","/verify-code","/forgot-password","/change-password").permitAll()// permit request without authentication
                        .requestMatchers("/ws/**").permitAll()// permit websocket request without authentication
                        .anyRequest().authenticated()
                )
                .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class)
                .logout(AbstractHttpConfigurer::disable);// disable logout otherwise it will conflict with our custom logout
        return http.build();
    }

到此這篇關(guān)于SpringSecurity Context 中 獲取 和 更改 當(dāng)前用戶信息的問(wèn)題的文章就介紹到這了,更多相關(guān)SpringSecurity Context 獲取當(dāng)前用戶信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java四大常用JSON解析工具性能對(duì)比(Hutool、Fastjson2、Gson與Jackson)

    Java四大常用JSON解析工具性能對(duì)比(Hutool、Fastjson2、Gson與Jackson)

    JSON?是現(xiàn)代軟件開(kāi)發(fā)中常用的數(shù)據(jù)交換格式,尤其在微服務(wù)和前后端分離的架構(gòu)中更是必不可少,本文將對(duì)?Java?中四大主流?JSON?解析庫(kù)進(jìn)行性能測(cè)試和對(duì)比分析,希望對(duì)大家有所幫助
    2025-05-05
  • SpringBoot3.x嵌入MongoDB進(jìn)行測(cè)試的步驟詳解

    SpringBoot3.x嵌入MongoDB進(jìn)行測(cè)試的步驟詳解

    本文介紹了在?Spring?Boot?應(yīng)用中使用Flapdoodle?Embed?Mongo進(jìn)行?MongoDB?測(cè)試的方法,包括Embed?Mongo?的概念,添加依賴、配置、運(yùn)行測(cè)試的步驟,還列舉了其優(yōu)勢(shì)如快速啟動(dòng)關(guān)閉、環(huán)境一致、無(wú)需外部依賴等,以及注意事項(xiàng)和結(jié)論,需要的朋友可以參考下
    2024-12-12
  • 利用SpringBoot解決多個(gè)定時(shí)任務(wù)阻塞的問(wèn)題

    利用SpringBoot解決多個(gè)定時(shí)任務(wù)阻塞的問(wèn)題

    當(dāng)我們?cè)赟pring Boot應(yīng)用中使用多個(gè)定時(shí)任務(wù)時(shí),任務(wù)之間的阻塞可能是一個(gè)常見(jiàn)的問(wèn)題,這可能會(huì)因任務(wù)之間的依賴、執(zhí)行時(shí)間過(guò)長(zhǎng)或資源爭(zhēng)用等原因而發(fā)生,本文讓我們深入探討如何利用Spring Boot來(lái)解決多個(gè)定時(shí)任務(wù)阻塞的問(wèn)題,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-01-01
  • EasyExcel實(shí)現(xiàn)讀寫Excel文件的示例代碼

    EasyExcel實(shí)現(xiàn)讀寫Excel文件的示例代碼

    EasyExcel是阿里巴巴開(kāi)源的一個(gè)excel處理框架,以使用簡(jiǎn)單、節(jié)省內(nèi)存著稱。它可以在盡可能節(jié)約內(nèi)存的情況下支持讀寫百M(fèi)的Excel,所以本文就將利用它實(shí)現(xiàn)讀寫Excel文件,感興趣的可以了解一下
    2022-08-08
  • java 轉(zhuǎn)發(fā)和重定向區(qū)別及實(shí)例代碼

    java 轉(zhuǎn)發(fā)和重定向區(qū)別及實(shí)例代碼

    這篇文章主要介紹了java 轉(zhuǎn)發(fā)和重定向區(qū)別及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • IDEA中springboot提示java:找不到符號(hào)符號(hào):變量log問(wèn)題

    IDEA中springboot提示java:找不到符號(hào)符號(hào):變量log問(wèn)題

    這篇文章主要介紹了IDEA中springboot提示java:找不到符號(hào)符號(hào):變量log問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java SpringBoot容器注入對(duì)象詳解

    Java SpringBoot容器注入對(duì)象詳解

    本文通過(guò)實(shí)例代碼給大家詳解了springboot獲取ioc容器中注入的bean問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • Javaweb實(shí)現(xiàn)上傳下載文件的多種方法

    Javaweb實(shí)現(xiàn)上傳下載文件的多種方法

    本篇文章主要介紹了Javaweb實(shí)現(xiàn)上傳下載文件,有多種實(shí)現(xiàn)方式,需要的朋友可以參考下。
    2016-10-10
  • Java集合遍歷全指南(迭代器&增強(qiáng)for及列表迭代器)

    Java集合遍歷全指南(迭代器&增強(qiáng)for及列表迭代器)

    本文詳盡介紹了Java集合遍歷的5種方式:迭代器、增強(qiáng)for、列表迭代器、普通for及Lambda表達(dá)式,通過(guò)代碼示例和原理解析,幫助讀者徹底掌握集合遍歷的核心知識(shí),避免常見(jiàn)錯(cuò)誤如并發(fā)修改異常和指針復(fù)位問(wèn)題,適合Java初學(xué)者及面試復(fù)習(xí),需要的朋友可以參考下
    2026-02-02
  • 使用springBoot中的info等級(jí)通過(guò)druid打印sql

    使用springBoot中的info等級(jí)通過(guò)druid打印sql

    這篇文章主要介紹了使用springBoot中的info等級(jí)通過(guò)druid打印sql,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

贡山| 丹凤县| 怀柔区| 乌拉特前旗| 雷山县| 延吉市| 额济纳旗| 济宁市| 五莲县| 镇赉县| 龙海市| 南乐县| 洛南县| 新巴尔虎右旗| 南陵县| 通许县| 资源县| 贞丰县| 天柱县| 岐山县| 孝义市| 土默特右旗| 松阳县| 清流县| 巴东县| 和硕县| 巫山县| 南昌县| 乌兰察布市| 孝义市| 长乐市| 安徽省| 商丘市| 仁寿县| 瓦房店市| 聂拉木县| 高密市| 河曲县| 海口市| 萝北县| 邹平县|