web-dev-qa-db-ja.com

SecurityContextHolder.getContext()。getAuthentication()がnullを返す

次のコードを使用して、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になりますか?

16
Rajesh Wadhwa

だから私は実際の問題を見つけました!問題は、コントローラ全体をsecurity-context.xmlでsecurity = "none"とマークしていたことでした。したがって、最初のリンクから2番目のリンクにバウンスされたとき、セキュリティコンテキストは渡されません。ご迷惑をおかけして申し訳ありません。

10
Rajesh Wadhwa

追加の回答:保護されていないURLのログインユーザーの詳細を取得する場合は、保護されたURLに追加して、次のように「permitAll」として割り当てることができます。

<http>
    //...

    <intercept-url pattern="/your/url/**" access="permitAll"/>

    //...
</http>

次に、ログインしている場合は、ログインしているユーザーを確認したり、資格情報を取得したりできます。

2

LocalUserがnullであるため、authがnullになるため、認証コンテキストがセキュリティコンテキストに追加されていません。

ドキュメントをご覧ください

http://docs.spring.io/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/core/userdetails/User.html

CustomUserDetailsS​​erviceを用意することをお勧めします

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);
0
RPaul