3

Web ベースのフォーム ログイン認証が機能しj_securtiy_checkています。プログラムによるログイン認証で変更したいと考えています。サーブレットに渡されたユーザー名とパスワードを認証させる適切な方法は何ですか? サーブレットは明らかに保護されていません。

この server.xml レルムで実験を行っています。

<Realm  className="org.apache.catalina.realm.DataSourceRealm"
    dataSourceName="UserDatabase"
    userTable="app_user" userNameCol="login_name" userCredCol="password_value"
    userRoleTable="user_perm" roleNameCol="permission_name"
    allRolesMode="authOnly" digest="MD5"
/>

この理由は、保護されていない loginServlet にログイン情報を送信する Java Webstart クライアントがあるためです。このサーブレットは現在、JOSSO シングル サインオン サービスに対して認証を行っていますが、これを削除して、単純な tomcat7 認証を最初に使用したいと考えています。その後、最終的に OpenAM に移行します。プログラムで JSSESSIONIDSSO 値を生成し、これを Cookie に詰め込むことができれば。

これは私が見つけたいくつかのコードです。これは認証を呼び出す正しい方法ですか?

ApplicationContextFacade acf = (ApplicationContextFacade) this.getServletContext();

Field privateField = ApplicationContextFacade.class.getDeclaredField("context");  
privateField.setAccessible(true);  
ApplicationContext appContext = (ApplicationContext) privateField.get(acf);  
Field privateField2 = ApplicationContext.class.getDeclaredField("context");  
privateField2.setAccessible(true);  
StandardContext stdContext = (StandardContext) privateField2.get(appContext);  
Realm realm = stdContext.getRealm();  

Principal principal = realm.authenticate(loginBean.getUsername(), loginBean.getPassword());  
if (principal == null)
{
   return 0;
}
GenericPrincipal genericPrincipal = (GenericPrincipal) principal;

System.out.println ("genericPrincipal=" + genericPrincipal.toString());
4

4 に答える 4

5

すでに Servlet 3.0 以降を使用している場合、プログラムによる認証にはlogin()のメソッドを使用しHttpServletRequestます。

if (request.getUserPrincipal() == null) {
    request.getSession(); // create session before logging in
    request.login(username, password);
}

サーブレット API は、コンテナ管理のセキュリティにプログラムでアクセスするためのメソッドをlogin()提供します。logout()

于 2014-02-26T13:14:04.940 に答える
1

Java webstart クライアント アプリでは、認証を要求する必要がある場合、任意の HTTP クライアントを使用して、POST メソッドを使用して LoginServer に userName、password を送信するだけだと思います。loginServlet では、 request.login ( userName, password ) を使用し、認証結果を任意の形式 (XML、JSON) で返します。クライアント側では、認証結果 ( POST 結果 ) と応答ヘッダーからの JSESSIONID Cookie も解析する必要があります。後続のリクエストでは、以前に解析した JSESSIONID を送信する必要がある場合があります。

于 2013-12-10T22:36:31.387 に答える