あなたが望むものを達成するためのいくつかの方法を考えることができます。
まず、Spring Security の taglib を使用して、ユーザーが正しく認証されているかどうかに応じて、View テンプレートのコンテンツを条件付きでレンダリングできます。Spring Security taglib の詳細については、こちらを参照してください。大雑把に言えば、これにより View テンプレートは次のようになります。
if(user is authenticated)
render content for authenticated user
else
render log-in form
ただし、ユーザーが正しく認証されたかどうかに関係なく、コントローラーは常にモデルを作成しているため、少し鈍いように感じます。また、ログイン フォームを表示する場合は常に、View テンプレートでこのロジックが必要になります。
別のアプローチは、ユーザーが完全に認証されるまで、ログイン ページのレンダリングを担当するコントローラーにすべての要求を転送するHandlerInterceptor実装を作成することです。これを行うには、HandlerInterceptor の preHandle() メソッドを使用できます。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyHandlerInterceptor implements HandlerInterceptor
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
SecurityContext sc = SecurityContextHolder.getContext();
boolean userAuthenticated = true;
/* Some logic in here to determine if the user is correctly authenticated */
if(!userAuthenticated)
{
request.getRequestDispatcher("/login").forward(request, response);
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{
}}
次に、この機能が必要な URL に HandlerInterceptor 実装をマップするように Spring MVC を構成できます。これにより、すべてのコントローラーでロジックを複製する必要がなくなり、簡単にテストできます。