1. ホーム
  2. spring

[解決済み] SpringでSession Objectを取得するには?

2023-04-05 21:42:57

質問内容

私は比較的新しい とSpringのセキュリティに詳しいです。

Spring securityを使って、サーバー側でユーザー認証を行う必要があるプログラムを書こうとしていました。

というのを思いつきました。

public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{
    @Override
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken)
                    throws AuthenticationException
    {
        System.out.println("Method invoked : additionalAuthenticationChecks isAuthenticated ? :"+usernamePasswordAuthenticationToken.isAuthenticated());
    }

    @Override
    protected UserDetails retrieveUser(String username,UsernamePasswordAuthenticationToken authentication) throws AuthenticationException 
    {
        System.out.println("Method invoked : retrieveUser");
        //so far so good, i can authenticate user here, and throw exception if not authenticated!!
        //THIS IS WHERE I WANT TO ACCESS SESSION OBJECT
    }
}

私の使用例では、ユーザが認証されたときに、次のような属性を配置する必要があります。

session.setAttribute("userObject", myUserObject);

myUserObjectはあるクラスのオブジェクトで、複数のユーザーからのリクエストに対してサーバーコード全体でアクセスすることができます。

どのように解決するのですか?

あなたの友人は、ここで org.springframework.web.context.request.RequestContextHolder

// example usage
public static HttpSession session() {
    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
    return attr.getRequest().getSession(true); // true == allow create
}

これは標準的なspring mvcのディスパッチサーブレットによって生成されます。 org.springframework.web.filter.RequestContextFilter の中にフィルターとして web.xml をフィルタリングしてホルダーを管理します。

EDIT : 余談ですが、あなたは実際に何をしようとしているのでしょうか? HttpSession の中にある retieveUser メソッドの UserDetailsService . Spring securityはどのようにしてもUserDetailsオブジェクトをセッションに置いてくれます。にアクセスすることで、それを取得することができます。 SecurityContextHolder :

public static UserDetails currentUserDetails(){
    SecurityContext securityContext = SecurityContextHolder.getContext();
    Authentication authentication = securityContext.getAuthentication();
    if (authentication != null) {
        Object principal = authentication.getPrincipal();
        return principal instanceof UserDetails ? (UserDetails) principal : null;
    }
    return null;
}