3

doGetJSFアクション(またはサーブレット/doPostメソッド)からユーザーを認証するにはどうすればよいですか? 私は次のようなことを意味します:

Authenticator auth = ...;
if (!auth.authenticate("user","password"))
{
    FacesContext.getInstance().addMessage("Incorrect username or password", null);
}

制限:

  • このメソッドは、コンテナ管理のセキュリティと互換性がある必要があります。(つまり、`HttpServletRequest.getRemoteUser()` は認証されたユーザーを返す必要があります)
  • このメソッドは、どこでも (つまり、各アプリケーション サーバー上で) 機能する必要があります。

j_security_checkまたは別の J2EE 認証タイプ (BASIC、DIGEST など)を使用しない

可能です?
または、この方法でキャプチャを作成する方法は?
ログインとパスワードが空でないことを検証しますか?
もちろん、JavaScript を使用せずに 1 つのページで...

同様の質問...ただし、この質問に対する回答はありません:

JSFの認証と認可
j_security_checkを使ってJava EE / JSFでユーザー認証を行う

編集 1 :
少なくとも 2.3 のサーブレット API を意味します。はい、サーブレット API 3.0 について読みましloginたが、これはアプリケーション サーバーの新しいバージョンでのみサポートされています。

アプリケーションサーバーごとにこの認証を実装するソリューションがここにあると思います。時にはいくつかのハックを介して、時にはこの目的のために設計された特別なクラスを介して。このような:

private Class<?> tryClass(String name)
{
    try
    {
        return Class.forName(name);
    }
    catch (ClassNotFoundException e)
    {
        return null;
    }
}

public boolean authenticate(String username, String password) throws AuthenticationException
{
    try
    {

        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        Object request = context.getRequest();
        Object response = context.getResponse();

        Class<?> authClass = tryClass("com.sun.appserv.security.ProgrammaticLogin");
        if (authClass != null)
        {
            return (Boolean)authClass.getMethod("login").invoke(
                authClass.newInstance(), "user", "password", request, response);
        }

        authClass = tryClass("org.jboss.web.tomcat.security.login.WebAuthentication");
        if (authClass != null)
        {
            return (Boolean)authClass.getMethod("login").invoke(
                authClass.newInstance(), "user", "password");
        }

        // ... other hacks ...application servers 

    }
    catch (Exception e)
    {
        throw new AuthenticationException("an error occured during user authentication", e);
    }

    return false;
}
4

2 に答える 2

1

ああ、それはJ2EE 1.3 Java EE 5 です。残念なことに、コンテナー管理のセキュリティーを進めたい場合はいつでも不運です。カバーの下からコンテナー固有の実装を取得する必要があります。ちなみに、「j_security_checkBASIC/DIGESTなしのコンテナ管理セキュリティ」は自己矛盾しています。個人的には、すべてを忘れてセキュリティを自作するか、Spring Securityなどのより構成可能なサードパーティの実装を取得します。

于 2010-11-17T21:00:42.817 に答える
1

プログラムによるログインはかなりトリッキーで、アプリケーション サーバーによって異なるようです。j_security_check を使用するのが最も効果的であり、さまざまなアプリケーション サーバーでアプリケーションを動作させることができると思います。

難しい部分は、アプリケーション サーバーに認証を受け入れさせることです。Tomcat では、myLoginModule .login() を実行してログイン モジュールを成功させることができましたが、ユーザーはコンテナーで認証されませんでした。JBoss には、JBoss と Tomcat の間でプログラム認証を機能させるためのコードがいくつかあります (Tomcat は JBoss 内に存在するため)。Glassfish について調べてみたところ、プログラムによるログインは非常に難しく、プロに任せるべきだという印象を受けました。

Glassfish のドキュメント (http://docs.sun.com/app/docs/doc/820-4496/beacm?a=view) は次のように述べています。

プログラムによるログインは Enterprise Server に固有のものであり、他のアプリケーション サーバーには移植できません。

編集

j_security_check メソッドに慣れるには少し時間がかかりますが、回避する方法を習得すれば、非常にうまくいく可能性があります。基本的に、ユーザーをアプリケーションにリダイレクトするウェルカム ページを作成できます。ユーザーがまだログインしていない場合は、ログイン ページに送信されます。ログイン ページは、サイトのホームページにすることができます。ホームページにアクセスすると、ユーザーはサイトの他の「安全でない」ページに移動できます。必要に応じて、これらのページにログイン フォームを含めることもできます。1 つのログイン ページで立ち往生しているわけではありません。

編集 2

AJAX (Richfaces 経由) を使用してユーザーのユーザー名/パスワードを確認し、必要に応じてエラー メッセージを表示しています。資格情報が正しい場合、j_security_check を指すフォームが送信され、実際の認証が行われます。

編集 3

2 番目のリンクされた質問 (http://stackoverflow.com/questions/2206911/best-way-for-user-authentication-on-javaee-6-using-jsf-2-0) で BalusC によって提案されたプログラムによるログイン方法request.login(...)素晴らしく見える。すぐに試してみます ;o) サーブレット 3 は Glassfish 3 でサポートされていますが、それ以外はまだサポートされていません (Tomcat 7、おそらく JBoss 6 の一部になる予定です)。

于 2010-11-17T18:20:06.330 に答える