算是很全各種方式啦,就看哪種最適合在項目使用了
第一種方式,從 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