spring-security 獲取用戶信息的 N 種方式

算是很全各種方式啦,就看哪種最適合在項目使用了

第一種方式,從 Authentication 獲取

@RestController
public class IndexController {

    @GetMapping("/no-public/user-info")
    String getUserInfo(
            Authentication authentication
    ) {
        return authentication.getName();
    }
}

設(shè)置登錄態(tài)的時候,填充到 principal 的是 MimeayDetail 類,在使用的時候可以將 authentication.getPrincipal() 轉(zhuǎn)成 MimeayDetail

@RestController
public class IndexController {

    @GetMapping("/no-public/user-info")
    MimeayDetail getUserInfo(
            Authentication authentication
    ) {
        MimeayDetail mimeayDetail = (MimeayDetail) authentication.getPrincipal();
        return mimeayDetail;
    }
}

第二種方式, 從 Principal 獲取

@RestController
public class IndexController {
    
    @GetMapping("/no-public/user-info")
    String getUserInfo(
            Principal principal
    ) {
        return principal.getName();
    }
}

第三種方式, 從自定義的用戶類取

取整個自定義用戶實體

@RestController
public class IndexController {

    @GetMapping("/no-public/user-info")
    MimeayDetail getUserInfo(
            @AuthenticationPrincipal MimeayDetail mimeayDetail
    ) {
        return mimeayDetail;
    }
}

自定義用戶類內(nèi)容

{
  "id": 1,
  "nickname": "chenxiaochi"
}

取自定義用戶實體某個字段

public class IndexController {

    @GetMapping("/no-public/user-info")
    String getUserInfo(
            @AuthenticationPrincipal(expression = "nickname") String nickname
    ) {
        return nickname;
    }
}

查閱文檔的時候,有一個做法也還不錯,不想在程序中使用 AuthenticationPrincipal, 則可以在包裝一層

@Target({ElementType.TYPE, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@AuthenticationPrincipal
public @interface MimeayUserDetail {
}

使用的時候就變成這樣

@RestController
public class IndexController {

    @GetMapping("/no-public/user-info")
    MimeayDetail getUserInfo(
            @MimeayUserDetail MimeayDetail mimeayDetail
            ) {
        return mimeayDetail;
    }
}

其他方式

從 CurrentSecurityContext 獲取

@RestController
public class IndexController {

    @GetMapping("/no-public/user-info")
    String getUserInfo(
           @CurrentSecurityContext(expression = "authentication") Authentication authentication
    ) {
        return authentication.getName();
    }
}

從 SecurityContextHolder 獲取

@RestController
public class IndexController {

    @GetMapping("/no-public/user-info")
    MimeayDetail getUserInfo(
    ) {
        MimeayDetail mimeayDetail = (MimeayDetail) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        return mimeayDetail;
    }
}

可運行 demo

https://github.com/imeay/mimeay_security

參考文章

https://www.springcloud.io/post/2022-02/spring-security-get-current-user/#gsc.tab=0
https://www.baeldung.com/get-user-in-spring-security

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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