技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

Springセキュリティ:ログインユーザー名をセッションから取得する方法

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」というユーザー名でログイン

f:id:akira2kun:20211024220715j:plain
 
・ログイン後のコンソール表示の確認
0001