Собственная Область Безопасности В Glassfish

Ни для кого не секрет, что серверы приложений существуют для того, чтобы снять часть работы с разработчика и возложить ее на готовые механизмы.

В частности, механизм аутентификации в сервере приложений Glassfish может быть организован с использованием так называемых Security Realms. Есть несколько встроенных опций, таких как аутентификация через СУБД, LDAP, PAM, Сертификат и обычное чтение из файла.

Однако они могут нам не подойти из-за своих ограничений (LDAP, например, может работать только с одним предопределённым доменом).

Поэтому мы рассмотрим возможность создания нашей собственной сферы безопасности.

Область пользовательской безопасности состоит как минимум из двух классов.

Один из которых расширяет класс AppservRealm (com.sun.appserv.security.AppservRealm), а второй, соответственно, 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. Соответственно, здесь мы можем реализовать гибкость механизма получения групп по имени пользователя, например из СУБД.

В этом примере используется одна группа, что указывает на то, что пользователь прошел проверку подлинности.

Здесь указывается свойство 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()); } } }

В этом классе вам необходимо реализовать метод аутентификации.

Он состоит из получения и проверки использующего его реалма, проверки правильности введенных логина и пароля (или других реквизитов) и, наконец, получения и передачи групп пользователей.

Скомпилированные классы (пакеты с соответствующими классами внутри) помещаем в директорию /lib/классы Нам также необходимо определить, что наш AppservPasswordLoginModule принадлежит определенному контексту.

Вам нужно отредактировать файл /config/login.conf, добавив «ссылку»:

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

В котором мы определяем контекст и говорим о необходимости модуля.

Не стесняйтесь запускать/перезагружать наш сервер приложений и открывать графический интерфейс администратора.

Создайте новую область безопасности.

Теперь нам не нужно выбирать класс из списка, а ввести полный класс реалма: ru.khmb.security.Realm. Не забываем указать опцию jaas-context, которая связывает наш реалм с модулем аутентификации через контекст, указанный в файле login.conf, т.е.

в нашем случае jaas-context = KHMBRealm Вот и все, теперь вы можете использовать Realm. При реализации механизма источником была запись в блог .

Обновление от 02.08.2013: Хорошее описание создания различных Security Realms (областей безопасности) есть в книге Дэвида Хеффельфингера «Java EE 6 и сервер приложений GlassFish 3».

Теги: #java #glassfish #security #java

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.