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));
}
}