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

SpringSecurity獲取當(dāng)前登錄用戶的信息的幾種方法實(shí)現(xiàn)

 更新時(shí)間:2025年03月24日 08:30:44   作者:代碼代碼快快顯靈  
本文主要介紹了SpringSecurity中獲取當(dāng)前登錄用戶信息的多種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在 Spring Security 中,當(dāng)前登錄用戶的信息實(shí)際上都存儲(chǔ)在與當(dāng)前線程綁定的 SecurityContext 中,里面保存了一個(gè) Authentication 對(duì)象。你展示的這幾種寫法,其實(shí)都是不同的方式來(lái)獲取這個(gè) Authentication 對(duì)象或者從中提取出用戶信息。下面詳細(xì)說(shuō)明每種方式的原理和適用場(chǎng)景:

1. 直接注入 Principal

@GetMapping("/welcome")
@ResponseBody
public Object toLoginInfo(Principal principal){
    return principal;
}

說(shuō)明:

當(dāng)你在 Controller 方法中直接聲明一個(gè) Principal 類型的參數(shù)時(shí),Spring Security 會(huì)自動(dòng)注入當(dāng)前登錄用戶對(duì)應(yīng)的 Principal 對(duì)象。通常,Principal 只包含最基本的用戶標(biāo)識(shí)(例如用戶名),但如果需要更多信息,就需要使用 Authentication。

2. 直接注入 Authentication

@GetMapping("/welcome2")
@ResponseBody
public Object toLoginInfo2(Authentication authentication) {
    return authentication;
}

說(shuō)明:Authentication 接口繼承自 Principal,除了包含用戶名外,還包含了用戶的權(quán)限信息(Authorities)、認(rèn)證憑證(Credentials)、認(rèn)證狀態(tài)等。直接注入 Authentication 可以獲取更豐富的信息,是實(shí)際開(kāi)發(fā)中常用的方式之一。

3. 注入 UsernamePasswordAuthenticationToken

@GetMapping("/welcome3")
@ResponseBody
public Object toLoginInfo3(UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken) {
    return usernamePasswordAuthenticationToken;
}
  • 說(shuō)明:UsernamePasswordAuthenticationToken 是 Authentication 的一個(gè)常見(jiàn)實(shí)現(xiàn),通常在基于表單登錄時(shí)使用。它除了保存用戶名和密碼,還保存了用戶權(quán)限等信息。直接注入這種類型的參數(shù),與直接注入 Authentication 類似,只是類型更加具體。

4. 通過(guò) SecurityContextHolder 獲取

@GetMapping("/welcome4")
@ResponseBody
public Object toLoginInfo4() {
    return SecurityContextHolder.getContext().getAuthentication();
}

說(shuō)明:這種方式是從靜態(tài)的 SecurityContextHolder 中獲取當(dāng)前線程綁定的 SecurityContext,再?gòu)闹腥〕?nbsp;Authentication 對(duì)象。使用這種方式可以在非 Controller 的地方(例如在業(yè)務(wù)邏輯或工具類中)獲取當(dāng)前登錄用戶的信息。

5. 使用自定義工具方法

@GetMapping("/welcome5")
@ResponseBody
public Object toLoginInfo5() {
    return LoginInfoUtil.getCurrentLoginUser();
}

說(shuō)明:這是一個(gè)對(duì)上面幾種方式的封裝,通常會(huì)在項(xiàng)目中封裝一個(gè)工具類(如 LoginInfoUtil),內(nèi)部封裝對(duì) SecurityContextHolder 的調(diào)用或者其他邏輯處理,返回一個(gè)更為友好的用戶信息對(duì)象。這樣做有利于集中管理和統(tǒng)一用戶信息的獲取邏輯。

LoginInfoUtil:

public class LoginInfoUtil {

    /**
     * 獲取當(dāng)前登錄用戶信息
     * @return
     */
    public static TUser getCurrentLoginUser() {
        return  (TUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    }
}

總結(jié)

  • 統(tǒng)一存儲(chǔ):Spring Security 將當(dāng)前認(rèn)證信息統(tǒng)一保存在 SecurityContext 中,通過(guò) SecurityContextHolder 實(shí)現(xiàn)線程級(jí)別的綁定。

  • 多種方式:你可以直接通過(guò)方法參數(shù)(如 Principal、Authentication 或更具體的認(rèn)證類)來(lái)獲取,也可以在任意位置通過(guò) SecurityContextHolder.getContext().getAuthentication() 獲取。這些方式本質(zhì)上都是獲取同一個(gè)對(duì)象,只是使用方式不同。

  • 擴(kuò)展與封裝:如果在項(xiàng)目中經(jīng)常需要獲取當(dāng)前用戶信息,可以封裝一個(gè)工具類,方便調(diào)用和后續(xù)擴(kuò)展。

Authentication 繼承自 Principal,這意味著它不僅包含基本的身份信息,還擴(kuò)展了額外的認(rèn)證細(xì)節(jié)。

UsernamePasswordAuthenticationToken 是 Authentication 接口的一個(gè)具體實(shí)現(xiàn),專門用于用戶名和密碼認(rèn)證的場(chǎng)景。

在實(shí)際認(rèn)證流程中,通常會(huì)通過(guò) UsernamePasswordAuthenticationToken 來(lái)封裝用戶提交的認(rèn)證信息,并在認(rèn)證成功后返回一個(gè)完整的認(rèn)證對(duì)象。

如何獲取更多的用戶信息

實(shí)體類實(shí)現(xiàn)UserDetails接口,實(shí)現(xiàn)UserDetails的7個(gè)接口,這樣,你既可以保留 Spring Security 要求的七個(gè)方法,又可以在實(shí)體類中擴(kuò)展其他的業(yè)務(wù)屬性。

自定義用戶實(shí)體類

擴(kuò)展業(yè)務(wù)屬性:在你的用戶實(shí)體類中,可以添加額外的屬性,例如真實(shí)姓名、郵箱、電話等等。

實(shí)現(xiàn) UserDetails 接口的七個(gè)方法:

  • getAuthorities():返回用戶擁有的權(quán)限(或角色),通常是一個(gè)包含 GrantedAuthority 對(duì)象的集合。

  • getPassword():返回用戶的密碼,用于身份驗(yàn)證。

  • getUsername():返回用戶名。

  • isAccountNonExpired():表示用戶賬戶是否未過(guò)期。返回 true 表示賬戶有效,未過(guò)期。

  • isAccountNonLocked():表示用戶賬戶是否未被鎖定。返回 true 表示賬戶未被鎖定。

  • isCredentialsNonExpired():表示用戶的憑證(密碼)是否未過(guò)期。

  • isEnabled():表示用戶賬戶是否可用(啟用狀態(tài))。

之后由于之前是返回UserDetails的實(shí)現(xiàn)類User,此時(shí)由于我們有自定義的實(shí)現(xiàn)類TUser,因此我們可以直接返回了,不需要使用框架的User類了。

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 通過(guò)用戶名查詢數(shù)據(jù)庫(kù)
     TUser user =  userMapper.selectByLoginAct(username);
     if (user == null){
         throw new UsernameNotFoundException("用戶不存在");
     }
     return user; // 實(shí)現(xiàn)了UserDetails接口,包含所有字段

//     // 返回框架User(UserDetails的實(shí)現(xiàn)類)但是使用UserDetails接收
//      return  User.builder()
//                .username(user.getLoginAct())
//                .password(user.getLoginPwd())
//                .authorities(AuthorityUtils.NO_AUTHORITIES) // 沒(méi)有權(quán)限(權(quán)限管理部分)
//                .build(); // 把UserDetails(User)返回給框架之后,框架會(huì)采用密碼加密器進(jìn)行密碼的比較
    }

如何忽略某些字段(不返回前端)以及規(guī)范日期格式

使用

@JsonIgnore // 表示該字段不返回給前端

如果實(shí)體類當(dāng)中日期類較多,每一個(gè)字段加上規(guī)范會(huì)很麻煩,因此一般會(huì)在application.yml當(dāng)中配置Jackson的轉(zhuǎn)換方式:

spring:
  application:
    name: Security-04-login-info

# jackson配置 時(shí)間格式(使用指定的時(shí)區(qū)和格式)
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss

登錄成功后的處理:

 @Bean// 安全過(guò)濾器鏈Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception { //httpSecurity方法參數(shù)注入Bean
        return httpSecurity
                // 配置自己的登錄頁(yè)面
                .formLogin( (formLogin) ->{
                    formLogin.loginProcessingUrl("/login") // 登錄賬戶密碼往哪個(gè)地址提交
                            .loginPage("/toLogin")// 定制登錄頁(yè)面
                            .successForwardUrl("/welcome"); // 登錄成功之后,跳轉(zhuǎn)到哪個(gè)頁(yè)面,默認(rèn)是跳轉(zhuǎn)到之前的頁(yè)面
                })
                .authorizeHttpRequests((authorizeHttpRequests)->{
                    authorizeHttpRequests
                            .requestMatchers("/toLogin","/common/captcha").permitAll() // 特殊情況,toLogin不需要登錄就可以訪問(wèn), 驗(yàn)證碼不需要登錄就可以訪問(wèn)
                            .anyRequest().authenticated(); // 除了上述特殊情況之外,其他任何請(qǐng)求都需要認(rèn)證之后才能訪問(wèn)
                })
                .addFilterBefore(captchaFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }

使用 .successForwardUrl("/welcome") 時(shí),Spring Security 在用戶登錄成功后不會(huì)發(fā)起新的 HTTP 請(qǐng)求,而是通過(guò)內(nèi)部的請(qǐng)求轉(zhuǎn)發(fā)(forward)的方式,將當(dāng)前請(qǐng)求轉(zhuǎn)發(fā)到指定的 URL(即 "/welcome")。這意味著:

  • 內(nèi)部轉(zhuǎn)發(fā): 請(qǐng)求在服務(wù)器內(nèi)部進(jìn)行轉(zhuǎn)發(fā),不會(huì)改變?yōu)g覽器地址欄顯示的 URL。
  • 請(qǐng)求方法保持不變: 轉(zhuǎn)發(fā)過(guò)程中,原始的 HTTP 請(qǐng)求方法(例如 POST)會(huì)被保留。因此,如果登錄請(qǐng)求是 POST,則轉(zhuǎn)發(fā)后的 "/welcome" 接口也是 POST 請(qǐng)求。
  • 常用于登錄成功后的處理: 這種方式適合需要在登錄成功后繼續(xù)處理原始請(qǐng)求數(shù)據(jù)或者保持請(qǐng)求上下文的場(chǎng)景。

總結(jié)來(lái)說(shuō),.successForwardUrl("/welcome") 用于在認(rèn)證成功后,將請(qǐng)求內(nèi)部轉(zhuǎn)發(fā)到 "/welcome" 接口,從而執(zhí)行相應(yīng)的處理邏輯,而不是向?yàn)g覽器發(fā)起新的請(qǐng)求。

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

相關(guān)文章

  • Java調(diào)用Python腳本傳遞數(shù)據(jù)并返回計(jì)算結(jié)果

    Java調(diào)用Python腳本傳遞數(shù)據(jù)并返回計(jì)算結(jié)果

    實(shí)際工程項(xiàng)目中可能會(huì)用到Java和python兩種語(yǔ)言結(jié)合進(jìn)行,這樣就會(huì)涉及到一個(gè)問(wèn)題,Java如何調(diào)用Python腳本,感興趣的可以了解一下
    2021-05-05
  • IDEA中Translation使用及問(wèn)題解決

    IDEA中Translation使用及問(wèn)題解決

    本文主要介紹了IDEA中Translation使用及問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • MyBatis逆向工程生成dao層增刪改查的操作

    MyBatis逆向工程生成dao層增刪改查的操作

    這篇文章主要介紹了MyBatis逆向工程生成dao層增刪改查的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java?20在Windows11系統(tǒng)下的簡(jiǎn)易安裝教程

    Java?20在Windows11系統(tǒng)下的簡(jiǎn)易安裝教程

    這篇文章主要給大家介紹了關(guān)于Java?20在Windows11系統(tǒng)下的簡(jiǎn)易安裝教程,學(xué)習(xí)Java的同學(xué),第一步就是安裝好Java環(huán)境,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java數(shù)據(jù)結(jié)構(gòu)之線段樹詳解

    Java數(shù)據(jù)結(jié)構(gòu)之線段樹詳解

    線段樹是一種二叉搜索樹,與區(qū)間樹相似,它將一個(gè)區(qū)間劃分成一些單元區(qū)間,每個(gè)單元區(qū)間對(duì)應(yīng)線段樹中的一個(gè)葉結(jié)點(diǎn)。本文將介紹線段樹的Java實(shí)現(xiàn)代碼,需要的可以參考一下
    2022-01-01
  • Spring?Boot各類變量的使用小結(jié)

    Spring?Boot各類變量的使用小結(jié)

    這篇文章主要介紹了Spring?Boot各類變量的使用小結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Java實(shí)現(xiàn)samza轉(zhuǎn)換成flink

    Java實(shí)現(xiàn)samza轉(zhuǎn)換成flink

    將Apache Samza作業(yè)遷移到Apache Flink作業(yè)是一個(gè)復(fù)雜的任務(wù),因?yàn)檫@兩個(gè)流處理框架有不同的API和架構(gòu),本文我們就來(lái)看看如何使用Java實(shí)現(xiàn)samza轉(zhuǎn)換成flink吧
    2024-11-11
  • 基于SSM+Shiro+Bootstrap實(shí)現(xiàn)用戶權(quán)限管理系統(tǒng)

    基于SSM+Shiro+Bootstrap實(shí)現(xiàn)用戶權(quán)限管理系統(tǒng)

    這篇文章主要介紹了基于SSM+Shiro實(shí)現(xiàn)一個(gè)用戶權(quán)限管理系統(tǒng),每位用戶只可訪問(wèn)指定的頁(yè)面,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,快跟隨小編一起學(xué)習(xí)吧
    2021-12-12
  • Springboot內(nèi)嵌tomcat應(yīng)用原理深入分析

    Springboot內(nèi)嵌tomcat應(yīng)用原理深入分析

    懂得SpringBoot的童鞋應(yīng)該很清楚,不管應(yīng)用程序是屬于何種類型,都是一個(gè)Main方法走遍天下,對(duì)于web應(yīng)用,只需要引入spring-boot-starter-web中這個(gè)依賴,應(yīng)用程序就好像直接給我們來(lái)了個(gè)tomcat一樣,對(duì)于嵌入式Tomcat,其實(shí)也非常簡(jiǎn)單,就是調(diào)用Tomcat提供的外部類
    2022-09-09
  • Java異常javax.net.ssl.SSLHandshakeException: SSL的解決方法

    Java異常javax.net.ssl.SSLHandshakeException: SSL的解決方法

    在Java開(kāi)發(fā)過(guò)程中,SSL(Secure Sockets Layer)握手異常是一個(gè)常見(jiàn)的網(wǎng)絡(luò)通信錯(cuò)誤,特別是在使用HTTPS協(xié)議進(jìn)行安全通信時(shí),本文將詳細(xì)分析javax.net.ssl.SSLHandshakeException: SSL這一異常的背景、可能的原因,并通過(guò)代碼示例幫助您理解和解決這一問(wèn)題
    2024-12-12

最新評(píng)論

无为县| 南溪县| 舞钢市| 呼玛县| 华蓥市| 澄城县| 汉阴县| 怀宁县| 宝丰县| 庆云县| 大庆市| 富宁县| 玛沁县| 鄱阳县| 廊坊市| 元谋县| 张北县| 林口县| 海淀区| 秀山| 浙江省| 前郭尔| 攀枝花市| 茂名市| 海阳市| 平定县| 开阳县| 宁海县| 曲周县| 黄大仙区| 东宁县| 循化| 织金县| 开原市| 丰都县| 新宁县| 江阴市| 遵义市| 游戏| 固安县| 东乌珠穆沁旗|