例えば
http://アプリケーションID/private/
というURLにアクセスした場合に、private下にはすべてgoogle認証をかけたい場合、
以下のようなFilterを作成します。
/**
* google認証を行うFilterクラス
*/
public class MemberFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
final UserService userService = UserServiceFactory.getUserService();
// リクエストのあったURL
final String requestUri = httpServletRequest.getRequestURI();
// googleアカウントにログインしているかを判定するUtilクラス(後述)
if (AccountUtils.isGoogleLogin(httpServletRequest) == false) {
((HttpServletResponse) response).sendRedirect(userService.createLoginURL(requestUri));
return;
}
// ログイン成功
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
/**
* google認証を判定するUtilクラス
*/
public class AccountUtils {
/**
* googleアカウントにログインしているかを判定する。
*
* @param request
* @return ログインしていればtrue, していなければfalse
*/
public static boolean isGoogleLogin(final HttpServletRequest request) {
final UserService userService = UserServiceFactory.getUserService();
final Principal principal = request.getUserPrincipal();
if (principal == null || userService.isUserLoggedIn() == false) {
return false;
}
return true;
}
}
以上です。
この例だと、「/private/」にアクセスした場合に、MembeerFilterクラスのdoFilterが呼ばれ、
17行目のif文でgoogleアカウントにログインしているかをチェックし、
falseならばログインページにリダイレクトされます。
ここで、注目して欲しいのが、14行目のrequestUri。
これがログイン後にリダイレクトされるパスを示しています。
18行目のuserService.createLoginURL(requestUri)では、ログインページのパスを作成し、
このパスには、ログイン後にアクセスするURL、つまり今回の例でいう「/private/」が含まれています。
ただ、ここでハマリどころなのですが、実際にアクセスしようとしたURLが「/private/」となっていても、
14行目で取得できるurlは「/private/index.jsp」。
つまり、ログイン後に飛ばされパスは「/private/index.jsp」となってしまいます。
Slim3では、jspファイルに直接アクセスできないようになっているので、
もちろんこれは403エラーになってしまいます。
これを解決するためには、MemberFilterクラスの18行目を、
((HttpServletResponse) response).sendRedirect(userService.createLoginURL(requestUri.replace("index.jsp", "")))
と修正して上げれば、ログイン後に飛ばされるパスから「index.jsp」が削除されるので、
問題なくControllerを経由してページにアクセスできるようになります。