8

認証プロセスを処理するカスタム フィルター UsernamePasswordAuthenticationFilter を作成しています。基本的に、ユーザーが REST /login を介してログイン http ポストを実行すると、カスタム フィルターが実行され、ユーザーの詳細と生成されたトークンを含む json 形式で応答する必要があります。

私の問題は、json 応答をクライアントに応答するように設定する場所です。私は、SavedRequestAwareAuthenticationSuccessHandler のサブクラスを作成し、そこに json 応答を設定することを考えています。これは良い考えですか?

どんな助けでも大歓迎です=)

ありがとう

4

1 に答える 1

6

独自の SuccessHandler を実装し、それを UsernamePasswordAuthenticationFilter に挿入する必要があります。

public class MyAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {

   public MyAuthenticationSuccessHandler() {
       super();
       setRedirectStrategy(new NoRedirectStrategy());
   }

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws IOException, ServletException {

           super.onAuthenticationSuccess(request, response, authentication);
           response.write("my JSON response");
    }


    protected class NoRedirectStrategy implements RedirectStrategy {

        @Override
        public void sendRedirect(HttpServletRequest request,
                HttpServletResponse response, String url) throws IOException {
            // no redirect

        }

    }

}

NoRedirectStrategy に注意してください。デフォルトでは、 UsernamePassword フィルターは、ログオンが成功した後にリダイレクトされますが、この場合はおそらく必要ありません。また、上記の実装では、フィルター チェーンが認証の成功時に終了することに注意してください。フィルターが適切な応答をレンダリングすることを確認する必要があります。基礎となるサーブレットに頼ってはいけません。

または、リダイレクトをそのままにして、クライアントを別の URL に送信し、探している JSON 応答をレンダリングすることもできます。

サンプル セキュリティ コンテキスト:

    <!--  Security -->
    <bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
        <sec:filter-chain-map path-type="ant">
            <sec:filter-chain pattern="/rest/login" filters="wsFilter"/>
        </sec>
    </bean>

    <bean id="wsFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
      <property name="authenticationManager" ref="myAuthenticationManager"/>
      <property name="authenticationSuccessHandler" ref="myAuthSuccessHandler"/>
      <property name="passwordParameter" value="pass"></property>
      <property name="usernameParameter" value="user"></property>
      <property name="postOnly" value="false"></property>
   </bean>

       <bean id="myAuthSuccessHandler" class="com.my.MyAuthenticationSuccessHandler"/>

    <sec:authentication-manager id="myAuthenticationManager" >
        <sec:authentication-provider user-service-ref="UserDetailsImpl">
            <sec:password-encoder hash="md5">
            </sec:password-encoder>
        </sec:authentication-provider>
    </sec:authentication-manager>
于 2013-01-29T20:06:51.283 に答える