doGet
JSFアクション(またはサーブレット/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;
}