カスタムセキュリティレルムは、少なくとも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」には、さまざまなセキュリティレルム(セキュリティエリア)の作成に関する適切な説明があります。