私たちのアプリケーションは Wicket を使用しています。認証を処理するために Wicket 独自のフォームを使用しています。主な利点は、サイトの外観が一貫していることです。
私たちのアプリケーションでは、ユーザーが認証メカニズムを途中で切り替えることができるため、コンテナ認証を行うことはできないと考えていました。Jetty 自体は、コンテナ レベルで単純な認証を機能させるだけで、とにかくかなりの摩擦を生み出していました。
そのため、フィルターを介して認証を実装することになりました (良い例がたくさんあります)。
これを行うことで、Wicket 認証がわずかに壊れていることがわかりました。何が起こったのですか:
- 匿名ユーザーがサイトにアクセスします。
- セキュリティ フィルターは、ユーザーが認証されていないと判断し、サインインにリダイレクトします。
- Wicket がサインイン ページをレンダリングします。
- ユーザーがサインインします。
- Wicket はサインイン フォームへの投稿を処理し、ユーザーをリダイレクトします。
- セキュリティ フィルターは、ユーザーが認証されていないと判断し、リダイレクトします...
AuthenticatedWebSession のサブクラスを調べて、HttpSession を取得し、フィルターからチェックできるセッション属性を設定する方法を見つけようとしました。しかし、私は一生それを行う方法を見つけることができませんでした。
私がやろうとしたことは、次のようにコード化されたさらに別の filterを作成することでした:
public class StealWicketUserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Nothing to initialise.
}
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException
{
filterChain.doFilter(servletRequest, servletResponse);
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
if ("POST".equals(httpServletRequest.getMethod()) &&
"/sign_in".equals(httpServletRequest.getRequestURI())) {
HttpSession session = httpServletRequest.getSession();
ServerUser currentUser = (ServerUser)
session.getAttribute("wicket:webUIServlet:currentUser");
if (currentUser != null) {
session.setAttribute(CombinedSecurityFilter.CURRENT_USER_ATTRIBUTE,
currentUser);
}
}
else if ("/sign_out".equals(httpServletRequest.getRequestURI())) {
HttpSession session = httpServletRequest.getSession();
session.removeAttribute(CombinedSecurityFilter.CURRENT_USER_ATTRIBUTE);
}
}
@Override
public void destroy() {
// Nothing to destroy.
}
}
これはもちろん機能します (そして、Wicket がセッション属性を保存するプレフィックスを変更するまで機能し続けます)。
私が知りたいのは、これが悪い考えであるかどうか、そしてこの種のことを行うための「適切なウィケットの方法」があるかどうかです。
Wicket の認証だけを使用しない理由は、SPNEGO 認証と、場合によっては他の外部認証タイプをサポートしたかったからです。