GlassFishのネイティブセキュリティレルム

開発者から作業の一部を削除し、既成のメカニズムに割り当てるためにアプリケーションサーバーが存在することは秘密ではありません。 特に、Glassfishアプリケーションサーバーの認証メカニズムは、いわゆるセキュリティレルムを使用して編成できます。 DBMSによる認証、LDAP、PAM、証明書、ファイルからの定期的な読み取りなど、いくつかの組み込みオプションがあります。 ただし、それらの制限のために私たちに合わない場合があります(たとえば、LDAPは事前に指定された1つのドメインでのみ機能します)。 したがって、独自のセキュリティレルムの作成を検討します。



カスタムセキュリティレルムは、少なくとも2つのクラスで構成されます。 1つはAppservRealmクラス(com.sun.appserv.security.AppservRealm)を拡張し、2つ目はそれぞれAppservPasswordLoginModule(com.sun.appserv.security.AppservPasswordLoginModule)を拡張します。 com.sun.appserv.securityを取得するには* /glassfish/modules/security.jarをライブラリとしてインポートする必要があります

package ru.khmb.security; import com.sun.appserv.security.AppservRealm; import com.sun.enterprise.security.auth.realm.BadRealmException; import com.sun.enterprise.security.auth.realm.InvalidOperationException; import com.sun.enterprise.security.auth.realm.NoSuchRealmException; import com.sun.enterprise.security.auth.realm.NoSuchUserException; import java.util.Enumeration; import java.util.Properties; import java.util.Vector; public class Realm extends AppservRealm { private static final String PARAM_JAAS_CONTEXT = "jaas-context"; private static final String GROUP_ALL = "Authenticated"; @Override public void init(Properties properties) throws BadRealmException, NoSuchRealmException { String propJaasContext = properties.getProperty(PARAM_JAAS_CONTEXT); if (propJaasContext != null) { setProperty(PARAM_JAAS_CONTEXT, propJaasContext); } } @Override public String getAuthType() { return "KHMB Realm"; } @Override public Enumeration getGroupNames(String user) throws InvalidOperationException, NoSuchUserException { Vector vector = new Vector(); vector.add(GROUP_ALL); return vector.elements(); } }
      
      







レルムクラスでは、認証タイプ(通常はレルムの名前)を取得し、名前でユーザーグループを取得するためのメソッドを再定義する必要があります。この記事では、Java EE承認の概要を意図的に見落とします。

したがって、ここでは、DBMSなどからユーザー名でグループを取得するメカニズムの柔軟性を実現できます。 この例では、ユーザーが認証されていることを示す1つのグループを使用しています。 プロパティjaas-contextは、このクラスを次のものに関連付けるためにここで指定されます。



 package ru.khmb.security; import com.sun.appserv.security.AppservPasswordLoginModule; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; import javax.security.auth.login.LoginException; public class LoginModule extends AppservPasswordLoginModule { @Override protected void authenticateUser() throws LoginException { if (!(_currentRealm instanceof Realm)) { throw new LoginException("Realm not KHMBRealm"); } Realm realm = (Realm) _currentRealm; authenticate(_username, _password); Enumeration enumeration = null; List<String> authenticatedGroups = new LinkedList(); try { enumeration = realm.getGroupNames(_username); } catch (Exception e) { throw new LoginException("Get groups exception"); } for (int i = 0; enumeration != null && enumeration.hasMoreElements(); i++) { authenticatedGroups.add((String) enumeration.nextElement()); } commitUserAuthentication(authenticatedGroups.toArray(new String[0])); } private static void authenticate(String login, String password) throws LoginException { try { LDAP.authenticate(login, password); } catch (Exception e) { throw new LoginException("Authenticate exception:" + e.getMessage()); } } }
      
      





このクラスでは、認証方法を実装する必要があります。 これは、それを使用したレルムの受信と検証、入力されたログインとパスワード(またはその他の詳細)の正当性の検証、最後にユーザーグループの受信と送信で構成されます。

コンパイルされたクラス(対応するクラスが内部にあるパッケージ)は<glassfish domain> / lib / classesディレクトリに配置されます

また、AppservPasswordLoginModuleがコンテキスト固有であることを判断する必要があります。 「リンク」を追加して、ファイル<glassfish domain> /config/login.confを編集する必要があります。

 KHMBRealm { ru.khmb.security.LoginModule required; };
      
      





コンテキストを定義し、モジュールの必要性を参照します。



アプリケーションサーバーを自由に起動/再起動して、管理者のGUIを開いてください。

新しいセキュリティレルムを作成します。 ここで、リストからクラスを選択する必要はありませんが、完全なレルムクラス(ru.khmb.security.Realm)を入力します。 login.confファイルで指定されたコンテキストを介して、レルムを認証モジュールに関連付けるjaas-contextオプションを指定することを忘れないでください。 この場合、jaas-context = KHMBRealm



すべて、今ではレルムを使用できます。



メカニズムを実装するとき、ソースはブログ投稿でした。



2013年8月2日更新:

David Heffelfingerの著書「Java EE 6およびGlassFish 3 Application Server」には、さまざまなセキュリティレルム(セキュリティエリア)の作成に関する適切な説明があります。



All Articles