3

2ページのWebサイトを構築しています。レシピ一覧ページ、レシピ詳細ページ、サインインページです。ユーザーは、レシピ一覧ページまたはレシピ詳細ページのサインイン ボタンをクリックして、Web サイトにサインインできます。ユーザーがサインイン ボタンをクリックすると、ユーザーはサインイン ページに移動します。ユーザーがレシピ詳細ページからサインイン ボタンをクリックした場合はレシピ詳細ページに、レシピ一覧ページからサインイン ボタンをクリックした場合はレシピ一覧ページに再度リダイレクトしたいと考えています。

このメソッドは Controller クラスに記述しました。このメソッドは、ユーザーが Web サイトにサインインするたびに呼び出されます。リファラー URL をセッションに保存しました。この URL をセッションに保存する目的は、ユーザーがサインイン ボタンをクリックしたページを追跡することです。また、私が書いた認証ハンドラーでユーザーをそのページにリダイレクトします。

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String openLoginPage(Model uiModel, HttpServletRequest request) {



    String referrer = request.getHeader("Referer");

    request.getSession().setAttribute("url_prior_login", referrer);

    return RECIPE_LOGIN_PAGE;
}

という認証ハンドラ クラスも作成しましたSuccessHandler

public class SuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

/*
 * (non-Javadoc)
 *
 * @see org.springframework.security.web.authentication.
 * SavedRequestAwareAuthenticationSuccessHandler
 * #onAuthenticationSuccess(javax.servlet.http.HttpServletRequest,
 * javax.servlet.http.HttpServletResponse,
 * org.springframework.security.core.Authentication)
 */
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
        Authentication authentication) throws ServletException, IOException {

    String url = (String) request.getSession().getAttribute("url_prior_login");

    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    if (principal != null && principal instanceof RecipeUser) {
        request.getSession().setAttribute("RecipeUser", (RecipeUser) principal);
    }


    getRedirectStrategy().sendRedirect(request, response, url);
}

}

このクラスは、ユーザーが Web サイトにサインインしたときに、レシピ一覧ページまたはレシピ詳細ページにリダイレクトします。このクラスをsecurity-context.xmlファイル内に登録します。

<http use-expressions="true" auto-config="false"  entry-point-ref="authenticationEntryPoint">
            <intercept-url pattern="/login" access="permitAll" />
            <form-login login-page="/login" authentication-failure-url="/loginfail"
                    default-target-url="/login"
                    authentication-success-handler-ref="successHandler" />
            <logout logout-success-url="/" />              
    </http>

    <authentication-manager alias="authManager">
            <authentication-provider user-service-ref='myUserDetailsService' />
    </authentication-manager>

    <beans:bean id="myUserDetailsService" class="com.safe.stack.service.security.UserService">
            <beans:property name="dataSource" ref="dataSource" />
    </beans:bean>

    <beans:bean id="successHandler"
            class="com.safe.stack.service.security.SuccessHandler" />


    <beans:bean id="authenticationEntryPoint"
            class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
            <beans:property name="loginFormUrl" value="/login"/>    
    </beans:bean>

これは私が達成したいことをする良い方法ですか? これを行うより良い方法はありますか?Spring MVC を使用してこれを行う方法の例は見つかりませんでした。

ありがとうございました

4

2 に答える 2

0

次のように、新しい属性「always-use-default-target」を「form-login」タグに追加し、「false」に設定します(デフォルトでは「true」に設定されます)。

<form-login 
  login-page="/login" authentication-failure-url="/loginfail"
  default-target-url="/login"
  authentication-success-handler-ref="successHandler" 
  always-use-default-target="false"
/>

詳細については、SpringSecurityのドキュメントセクション3.2.3の最後を参照してください。

これを追加すると、カスタムonAuthenticationSuccessは不要になり、ログインページのセッションに何も保存する必要がなくなります。

于 2012-12-30T16:59:45.560 に答える