среда, 13 марта 2013 г.

Настройка аутентификации на основе JAAS в JBoss AS 7

В предыдущей заметке мы рассмотрели процесс настройки сервера GlassFish 3 для выполнения аутентификации пользователей в web-приложении. Настало время сделать то же самое в JBoss AS 7.

Сразу договоримся, что будем использовать JBoss как standalone-сервер, следовательно все необходимые настройки будем выполнять, редактируя файл $JBOSS_HOME/standalone/configuration/standalone.xml.

Итак, для начала настроим соединение с базой данных (традиционно на примере PostgreSQL). Для этого в файле standalone.xml перейдём к разделу profile. Найдём в этом разделе подсистему c атрибутом пространства имён urn:jboss:domain:datasources:1.0 и добавим новый источник даных, а также зарегистрируем драйвер базы данных:
<subsystem xmlns="urn:jboss:domain:datasources:1.0">
    <datasources>
        <datasource jndi-name="java:/jdbc/AuthDemoDS" pool-name="AuthDemoPool" enabled="true" use-java-context="true">
            <connection-url>jdbc:postgresql://localhost:5432/authdemo</connection-url>
            <driver>postgresql</driver>
            <security>
                <user-name>postgres</user-name>
                <password>changeit</password>
            </security>
        </datasource>

        <drivers>
            <driver name="postgresql" module="org.postgresql">
                <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
            </driver>
        </drivers>
    </datasources>
</subsystem>
В атрибуте module описания драйвера базы данных мы ссылаемся на несуществующий пока еще модуль org.postgresql. Для добавления модуля перейдите в каталог $JBOSS_HOME/modules/org и создайте подкаталоги postgresql/main. В каталог main поместите драйвер базы данных PostgreSQL и там же создайте файл module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.postgresql">
    <resources>
        <resource-root path="postgresql-9.1-901-1.jdbc4.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.servlet.api" optional="true"/>
    </dependencies>
</module>

Следующий шаг - определение домена безопасности, в котором мы укажем желаемый модуль аутентификации. Вернитесь к разделу profile файла standalone.xml и найдите в этом разделе подсистему с пространством имён urn:jboss:domain:security:1.1. В указанной подсистеме создайте новый домен безопасности:
<subsystem xmlns="urn:jboss:domain:security:1.1">
    <security-domains>
        <security-domain name="auth-demo" cache-type="default">
            <authentication>
                <login-module code="Database" flag="required">
                    <module-option name="dsJndiName" value="java:/jdbc/AuthDemoDS"/>
                    <module-option name="principalsQuery" value="SELECT password FROM users WHERE username = ?"/>
                    <module-option name="rolesQuery" value="SELECT role_name, role_group FROM roles WHERE username = ?"/>
                </login-module>
            </authentication>
        </security-domain>
    </security-domains>
</subsystem>
В атрибуте code элемента login-module мы указали псевдоним модуля аутентификации
org.jboss.security.auth.spi.DatabaseServerLoginModule
Псевдонимы модулей жёстко зашиты в классе
org.jboss.as.security.ModulesMap
Среди них можно подобрать подходящий вам модуль. Если же ни один из них вас не устроит, разумеется можно воспользоваться самодельным, унаследовав класс от базового
org.jboss.security.auth.spi.AbstractServerLoginModule
или от одного из его потомков. Результат необходимо оформить в виде модуля сервера по аналогии с тем, как мы сделали это для драйвера базы данных. Не забудьте указать в module.xml необходимые вам зависимости от других модулей (как минимум, будет присутствовать зависимость от org.picketbox). После этого описание модуля аутентификации в standalone.xml слегка изменится:
...
<login-module code="org.demo.MyLoginModule" module="org.demo" flag="required">
.... 
Используемый нами в данном случае модуль аутентификации
 org.jboss.security.auth.spi.DatabaseServerLoginModule
принимает довольно много параметров. Мы задали самый минимум, указав JNDI-имя созданного нами ранее источника данных и SQL-запросы на выборку паролей и ролей с их группами по имени пользователя.

Единственное, что нам осталось сделать - это создать в нашем web-приложении рядом с web.xml дополнительный дескриптор jboss-web.xml, сославшись в нём на определенный нами домен безопасности:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 5.0//EN"
        "http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">
<jboss-web>
    <security-domain>auth-demo</security-domain>
</jboss-web>

Заключительным шагом в нашей прогулке по настройкам аутентификации на серверах приложений станет заметка о TomEE.

Комментариев нет:

Отправить комментарий