Для начала возьмём за основу наверное самый распространённый вариант аутентификации: учётные данные пользователей хранятся в некой базе данных. У нас также есть некое web-приложение, в котором будет выполняться form-based аутентификация.
Итак, первое что нужно сделать - это настроить на сервере соединение с базой данных (соединяться будем с PostgreSQL). Для этого необходимо создать пул соединений, а также связанный с этим пулом источник данных. Всё это удобно делать через консоль, предварительно создав файл glassfish-resources.xml примерно такого содержания:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN"
"http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
<jdbc-connection-pool name="AuthDemoPool"
allow-non-component-callers="false"
associate-with-thread="false"
connection-creation-retry-attempts="0"
connection-creation-retry-interval-in-seconds="10"
connection-leak-reclaim="false"
connection-leak-timeout-in-seconds="0"
connection-validation-method="auto-commit"
datasource-classname="org.postgresql.ds.PGSimpleDataSource"
fail-all-connections="false"
idle-timeout-in-seconds="300"
is-connection-validation-required="false"
is-isolation-level-guaranteed="true"
lazy-connection-association="false"
lazy-connection-enlistment="false"
match-connections="false"
max-connection-usage-count="0"
max-pool-size="32"
max-wait-time-in-millis="60000"
non-transactional-connections="false"
pool-resize-quantity="2"
res-type="javax.sql.DataSource"
statement-timeout-in-seconds="-1"
steady-pool-size="8"
validate-atmost-once-period-in-seconds="0"
wrap-jdbc-objects="false">
<property name="ServerName" value="localhost"/>
<property name="PortNumber" value="5432"/>
<property name="DatabaseName" value="authdemo"/>
<property name="User" value="postgres"/>
<property name="Password" value="changeit"/>
<property name="Url" value="jdbc:postgresql://localhost:5432/authdemo"/>
<property name="DriverClass" value="org.postgresql.Driver"/>
</jdbc-connection-pool>
<jdbc-resource enabled="true" jndi-name="jdbc/AuthDemoDS" object-type="user"
pool-name="AuthDemoPool"/>
</resources>
Затем, чтобы создать на сервере описанные в данном файле ресурсы, достаточно набрать в консоли
asadmin add-resources glassfish-resources.xml
Не забудьте положить в каталог glassfish3/glassfish/domains/<domain_name>/lib необходимые драйверы базы данных.
Для проверки только что созданного пула соединений выполните команду
Для проверки только что созданного пула соединений выполните команду
asadmin ping-connection-pool AuthDemoPool
Следующим шагом будет создание realm'a, - ресурса сервера, используемого web-приложениями для аутентификации пользователей. Набираем в консоли
asadmin create-auth-realm --classname com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm --property jaas-context=jdbcRealm:datasource-jndi="jdbc/AuthDemoDS":user-table=users:user-name-column=username:password-column=password:group-table=authorities:group-name-column=authority:digest-algorithm=SHA-512 auth-demo-jdbc-realm
В параметре classname необходимо указать имя класса realm'а, который мы хотим использовать для выполнения аутентификации. В параметре property указываются свойства, которые будут переданы realm'у при инициализации. В нашем случае это:
На этом подготовительные мероприятия на сервере закончены. Остаётся научить наше web-приложение пользоваться только что созданным ресурсом realm'а. Для этого редактируем файл web.xml:
- jaas-context - сценарий аутентификации, определённый в файле glassfish3/glassfish/domains/<domain_name>/config/login.conf;
- datasource-jndi - JNDI-имя источника данных, определенного нами ранее в файле glassfish-resources.xml;
- user-table - имя таблицы базы данных, содержащей логины/пароли пользователей;
- user-name-column - имя поля в таблице пользователей, хранящего логины;
- password-column - имя поля в таблице пользователей, хранящего пароли;
- group-table - имя таблицы базы данных, содержащей группы пользователей;
- group-name-column - имя поля в таблице групп, хранящего наименования этих самых групп;
- digest-algorithm - необязательное свойство, определяющее алгоритм хеширования паролей в базе данных.
На этом подготовительные мероприятия на сервере закончены. Остаётся научить наше web-приложение пользоваться только что созданным ресурсом realm'а. Для этого редактируем файл web.xml:
<login-config>
<auth-method>FORM</auth-method>
<realm-name>auth-demo-jdbc-realm</realm-name>
<form-login-config>
<form-login-page>/login.xhtml</form-login-page>
<form-error-page>/login.xhtml?auth-error=1</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>ROLE_USER</role-name>
</security-role>
<security-role>
<role-name>ROLE_ADMIN</role-name>
</security-role>
Здесь мы тегом realm-name сослались на определённый нами ресурс realm'а, а также объявили пару ролей, используемых в нашем web-приложении для разграничения доступа пользователей к ресурсам системы. На заключительном этапе необходимо задать отображение наименований ролей на группы пользователей. Добиться этого можно создав рядом с web.xml дополнительный дескриптор glassfish-web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN"
"http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
<security-role-mapping>
<role-name>ROLE_ADMIN</role-name>
<group-name>ROLE_ADMIN</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ROLE_USER</role-name>
<group-name>ROLE_USER</group-name>
</security-role-mapping>
</glassfish-web-app>
В нашем случае наименования групп пользователей совпадают с наименованиями соответствующих им ролей.
Может случиться такое, что функциональности, предоставляемой стандартными realm'ами GlassFish, окажется недостаточно и возникнет идея создания своего собственного realm'а. Нет ничего проще! В базовом случае достаточно расширить классы
Может случиться такое, что функциональности, предоставляемой стандартными realm'ами GlassFish, окажется недостаточно и возникнет идея создания своего собственного realm'а. Нет ничего проще! В базовом случае достаточно расширить классы
com.sun.appserv.security.AppservPasswordLoginModuleи
com.sun.appserv.security.AppservRealm
упаковать всё это добро в jar-архив и положить его в каталог glassfish3/glassfish/domains/<domain_name>/lib. Для того чтобы зарегистрировать на сервере созданный нами модуль логина, отредактируйте упомянутый ранее файл login.conf, добавив в него собственный сценарий аутентификации по аналогии с уже существующими:
customRealm {
<login_module_class_name> required;
};
Единственное, что остаётся - на этапе создания ресурса realm'а связать его с нужным сценарием аутентификации, сославшись на него в свойстве jaas-context.
В следующей заметке я планирую рассмотреть тот же процесс настройки аутентификации на сервере JBoss AS 7.
В следующей заметке я планирую рассмотреть тот же процесс настройки аутентификации на сервере JBoss AS 7.
Доброго времени суток. А можно пример БД для которой выполнена данная авторизация и пример как использовать права из этой БД в своих сервлетах?
ОтветитьУдалить