Ни для кого не секрет, что серверы приложений существуют для того, чтобы снять часть работы с разработчика и возложить ее на готовые механизмы.
В частности, механизм аутентификации в сервере приложений 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 как библиотеку.
В классе области необходимо переопределить методы получения типа аутентификации (обычно имени области) и получения групп пользователей по его имени — в этой статье мы намеренно опускаем обзор авторизации Java EE. Соответственно, здесь мы можем реализовать гибкость механизма получения групп по имени пользователя, например из СУБД.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(); } }
В этом примере используется одна группа, что указывает на то, что пользователь прошел проверку подлинности.
Здесь указывается свойство 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
-
«Уходи, Я Все Сделаю Сам»
19 Oct, 24 -
Youtube Изменит Алгоритм Поиска
19 Oct, 24 -
Мой Питомец - Linguaplayer
19 Oct, 24 -
Подкастер, Где Аудиотеги?
19 Oct, 24 -
Твиттер Не Работает
19 Oct, 24 -
Как Писать Высокодоступный Код
19 Oct, 24