1

SpringSecurityを使用してWebアプリのすべての認証を処理しています。これが状況です。たとえば、3つのJSPページがあるとします。

1)ログインページ
2)デフォルトのホームページ(認証が必要)
3)ユーザーアカウントページ(認証が必要)

標準フローは問題なく機能します。

1)ユーザーはログインページから正常にログインします
2)ユーザーはデフォルトのホームページに移動します

これが私が理解できないユースケースです

1)ユーザーが自分のアカウントページにアクセスしようとします(ただし、パスワードで保護されています)-動作します
2)ユーザーは資格情報を入力するようにリダイレクトされます-動作します
3)ユーザーは資格情報を正常に提供します-動作します
4)ユーザーは自分のアカウントページにリダイレクトされます-しませんWORK(デフォルトのホームページにリダイレクトします)

私はカスタムを使用していますAuthenticationSuccessHandlerが、問題は、リクエストがどこから来たのかを確認するときは常に、からであるということ/j_spring_security_checkです。

それらがどのページから来たのかを分離する簡単な方法はありますか?

SpringSecurityの設定に関連するapplicationContext.xmlの内容は次のとおりです。

<bean id="successfulLoginService" class="com.service.SuccessfulLoginService">
    <property name="defaultTargetUrl" value="/listings/add_listing.htm"/>
  </bean>

  <security:http pattern="/**.html" security="none" />
  <security:http pattern="/login/*.htm" security="none" />
  <security:http pattern="/listings/listing.htm" security="none" />
  <security:http pattern="/listings/viewListing.htm" security="none" />
  <security:http pattern="/search/keyword/*.htm" security="none" />

  <security:http auto-config="true">
    <security:intercept-url pattern="/**.htm" access="ROLE_USER" />
    <security:intercept-url pattern="/**/**.htm" access="ROLE_USER" />
    <security:form-login login-page="/login/login.htm" authentication-failure-handler-ref="failedLoginService" authentication-success-handler-ref="successfulLoginService"/>
  </security:http>

  <security:authentication-manager>
    <security:authentication-provider
      user-service-ref="userDetailsService" />
  </security:authentication-manager>

これが私のSuccessfulLoginService.javaです。

@Service("successfulLoginService")
public class SuccessfulLoginService extends SimpleUrlAuthenticationSuccessHandler
{
  @Autowired
  UserDao userDao;

  @Override
  public void onAuthenticationSuccess(HttpServletRequest request,
      HttpServletResponse response, Authentication authentication)
      throws IOException, ServletException
  {
    Users user = null;
    String username = ((SpringSecurityUser) authentication.getPrincipal()).getUsername();
    try
    {
      user = userDao.getUserByEmail(username);
    } catch (Exception e)
    {
      e.printStackTrace();
      throw new ServletException("Failed to login", e);
    }
    request.getSession().setAttribute("user", user);

    response.sendRedirect("/MyApplication" + determineTargetUrl(request, response));
  }
}
4

2 に答える 2

4

保存されたリクエストはから取得できますorg.springframework.security.web.savedrequest.RequestCache

カスタムサクセスハンドラーの内部:

RequestCache requestCache = new HttpSessionRequestCache();
SavedRequest savedRequest = requestCache.getRequest(request, response);
String targetUrl = savedRequest.getRedirectUrl();

詳細については、デフォルトSavedRequestAwareAuthenticationSuccessHandlerをご覧ください。

于 2013-02-11T11:55:58.353 に答える
0

default-target-urlをお探しですか?ログインに成功した後、ユーザーを特定の場所にリダイレクトするために使用できます。

于 2013-02-09T21:11:09.980 に答える