1. ホーム
  2. jsf

[解決済み] Java EE / JSF で j_security_check を使用してユーザー認証を行う。

2022-04-26 18:11:36

質問

JSF 2.0(およびコンポーネントが存在する場合)とJava EE 6のコアメカニズム(ログイン/パーミッションの確認/ログアウト)を使用するWebアプリケーションのユーザー認証に関する現在のアプローチは、JPAエンティティにユーザー情報を保持しているのかどうか疑問に思っています。Oracle Java EEチュートリアルは、これに関して少し疎いです(サーブレットのみを扱います)。

これは なし Spring-Security (acegi) や Seam のような他のフレームワークを利用しつつ、できれば新しい Java EE 6 プラットフォーム (web profile) にこだわろうと思っています。

どのように解決するのか?

Webを検索し、さまざまな方法を試した結果、Java EE 6の認証には次のような方法があります。

セキュリティ・レルムを設定する。

私の場合、データベース内にユーザーを登録していました。そこで、このブログの記事に従って、データベースのテーブルにあるユーザー名とMD5ハッシュ化したパスワードに基づいてユーザーを認証できるJDBC Realmを作成しました。

http://blog.gamatam.com/2009/11/jdbc-realm-setup-with-glassfish-v3.html

注:この投稿では、データベースのユーザーテーブルとグループテーブルについて述べています。私は、UserType enum属性を持つUserクラスが、javax.persistenceアノテーションを介してデータベースにマッピングされていました。私は、userTypeカラムをgroupカラムとして使用し、ユーザとグループに対して同じテーブルを持つレルムを構成し、それはうまく機能しました。

フォーム認証を使用します。

上記ブログの記事に引き続き、web.xml と sun-web.xml を設定しますが、BASIC 認証ではなく、FORM を使用します(実は、どちらでも良いのですが、私は結局 FORM を使用しました)。JSF ではなく、標準の HTML を使用します。

それから、上記のBalusCのヒントで、データベースからユーザー情報を遅延して初期化することを利用します。彼は、フェースコンテキストからプリンシパルを取得するマネージドビーンの中でそれを行うことを提案しました。私はその代わりに、各ユーザーのセッション情報を保存するためにステートフルセッションBeanを使用しましたので、セッションコンテキストを注入しました。

 @Resource
 private SessionContext sessionContext;

プリンシパルがあれば、ユーザ名を確認し、EJB Entity Managerを使ってデータベースからユーザ情報を取得し、私の SessionInformation EJBです。

ログアウトします。

また、ログアウトするのに最適な方法はないかと調べてみました。その結果、Servletを使うのが一番いいということがわかりました。

 @WebServlet(name = "LogoutServlet", urlPatterns = {"/logout"})
 public class LogoutServlet extends HttpServlet {
  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   HttpSession session = request.getSession(false);

   // Destroys the session for this user.
   if (session != null)
        session.invalidate();

   // Redirects back to the initial page.
   response.sendRedirect(request.getContextPath());
  }
 }

質問の日付からすると、私の回答は本当に遅いのですが、私と同じようにGoogleからここにたどり着いた他の人々の助けになることを願っています。

では、また。

ヴィトール・ソウザ