0

通常、私は自分のプロジェクトでカスタム ログイン フォームと Bean を使用して Java EE 認証を使用します。そこで、データベース (JDBC) からユーザー/パスワードを取得するように Glassfish を構成し、HttpServletRequest の login() メソッドを呼び出す RequestScoped Bean (「LoginBean」という名前) で login() メソッドを呼び出す jsf フォームを作成します。

ログイン試行が成功したら、「LoginService」と名付けた LoginBean にインジェクトされた SessionScoped Bean にユーザー情報を設定します。そして、他の多くの Web サイト ページや Bean では、常に LoginService を注入してそのデータにアクセスすることで、このデータを使用しています。

すべて問題ありませんが、ユーザーがまだログインを試みていなくても、ユーザーがログイン ページにアクセスすると、セッションが作成されていることに気付きました。私の推測では、オブジェクトの作成時に LoginService が常に LoginBean に注入されているために発生していると思われます。

そのため、2 つの質問があります。

  1. このセッションを気にする必要がありますか? これにより問題が発生する可能性はありますか?
  2. ユーザーがログインページにアクセスするたびにセッションを作成せずに、このカスタムログインを行う最良の方法は何ですか? つまり、成功した後にクエリ文字列でユーザー情報を渡すことができましたが、それは恐ろしいことです。:)

どうも。

4

2 に答える 2

2

これに CDI のタグを付けたので、次の方法でこれを行うことに少し疑問があります。

externalContext.getSessionMap().put("user", user);

私はグラスフィッシュに精通しておらず、「Java EE認証」が何であるかもわかりません。したがって、これは CDI+Tomcat ユーザーである私の 2 セントにすぎません。

CDIでこれを行いたい場合は、Beanをより細かく制御する必要があることを確認するために、Beanを@SessionScopedにするべきではありません。

userBean: @WindowScopedmyfaces CODI から取得します (deltaspike 0.4 に含まれる予定です)。loginBean を にします@RequestScoped。2 つ目の loginBean があります@ViewScoped(myfaces codi が必要です)。

@PreDestroy次に、メインの loginBean のメソッドで使用できます。@windowScoped認証済み == false の場合、 Beanを破棄する必要があります。

Bean は、@ViewScoped失敗したログイン試行の回数とユーザー名を記憶する責任があります。繰り返しますが、これは実際に @WindowScoped Bean を作成することだけを気にする場合のみです (私のプロジェクトでは必要ありません)。

于 2013-02-14T21:14:17.993 に答える
2

このセッションを気にする必要がありますか? これにより問題が発生する可能性はありますか?

依存します。サーバーが比較的「安っぽい」ハードウェアを使用している場合、ハードウェアの制限に達する前にサーバーが破棄できるよりも多くのセッションが作成される可能性があるため、DDOS 攻撃が成功する可能性は高くなります。


ユーザーがログインページにアクセスするたびにセッションを作成せずに、このカスタムログインを行う最良の方法は何ですか?

セッション スコープの Bean を注入しないでください。セッションUser内マップを自分で配置します。具体的な例については、j_security_check を使用した Java EE / JSF でのユーザー認証の実行の「更新」部分も参照してください。

public void login() throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext externalContext = context.getExternalContext();
    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();

    try {
        request.login(username, password);
        User user = userService.find(username, password);
        externalContext.getSessionMap().put("user", user);
        externalContext.redirect(originalURL);
    } catch (ServletException e) {
        // Handle unknown username/password in request.login().
        context.addMessage(null, new FacesMessage("Unknown login"));
    }
}
于 2013-02-14T17:05:14.377 に答える