次のコードを使用して、Spring Securityからユーザーを手動でバイパスします。
User localeUser = new User();
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(localeUser ,null, localeUser .getAuthorities());
SecurityContext securityContext = SecurityContextHolder.getContext();
securityContext.setAuthentication(auth);
// Create a new session and add the security context.
HttpSession session = request.getSession(true);
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
return "dummyLogin";
ダミーのログインページ(タイルで処理される)は、このような認証を取得しようとしている同じコントローラーで、異なるリクエストマッピングを内部的に呼び出します。
SecurityContextHolder.getContext().getAuthentication()
どこでnullになりますか?
だから私は実際の問題を見つけました!問題は、コントローラ全体をsecurity-context.xmlでsecurity = "none"とマークしていたことでした。したがって、最初のリンクから2番目のリンクにバウンスされたとき、セキュリティコンテキストは渡されません。ご迷惑をおかけして申し訳ありません。
追加の回答:保護されていないURLのログインユーザーの詳細を取得する場合は、保護されたURLに追加して、次のように「permitAll」として割り当てることができます。
<http>
//...
<intercept-url pattern="/your/url/**" access="permitAll"/>
//...
</http>
次に、ログインしている場合は、ログインしているユーザーを確認したり、資格情報を取得したりできます。
LocalUserがnullであるため、authがnullになるため、認証コンテキストがセキュリティコンテキストに追加されていません。
ドキュメントをご覧ください
CustomUserDetailsServiceを用意することをお勧めします
public class CustomUserDetailsService implements UserDetailsService
//implement the method which return a UserDetails Object
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
その後、あなたは使うことができます
UserDetails userDetails= customUserDetailsService.loadUserByUsername("name");
Authentication authentication= new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()) ;
SecurityContextHolder.getContext().setAuthentication(authentication);