Springセキュリティによるログインが成功すると、UserDetailsクラスのオブジェクトを含むorg.springframework.security.core.context.SecurityContextHolderがセッションに保持されます。
UserDetailsクラスのオブジェクトには、ログインしたユーザー名の情報が含まれます。
ログイン後の画面でのログインユーザー名の取得は、セッションに保持されているSecurityContextHolderからUserDetailsクラスのオブジェクトを取得することで実現できます。
サンプルコードは以下の通りです。
(ログインユーザー名の取得に関係しないコードは省略します)
【サンプルコード】
・SecuritySession.java
package com.example.util;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
@Component
public class SecuritySession {
public String getUsername() {
// SecurityContextHolderから
// org.springframework.security.core.Authenticationオブジェクトを取得
Authentication authentication = SecurityContextHolder.getContext()
.getAuthentication();
if (authentication != null) {
// AuthenticationオブジェクトからUserDetailsオブジェクトを取得
Object principal = authentication.getPrincipal();
if (principal instanceof UserDetails) {
// UserDetailsオブジェクトから、ユーザ名を取得
return ( (UserDetails) principal ).getUsername();
}
}
return null;
}
}
・MainCotroller.java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import com.example.util.SecuritySession;
import org.springframework.ui.Model;
import java.util.Locale;
@Controller
@RequestMapping("/main")
public class MainCotroller {
@Autowired
private SecuritySession securitySession;
/** メイン画面を表示 */
@GetMapping("/main")
public String getMain(Model model, Locale localem) {
System.out.println(securitySession.getUsername());
return "main/main";
}
}
【実行結果】
・「0001」というユーザー名でログイン
・ログイン後のコンソール表示の確認
0001