JBoss Wildfly — модуль входа в базу данных

JBoss Wildfly 8.0.0-Final
JSF 2.2.4

Сначала я создал логин, используя application-users.properties и application-roles.properties. Добавлен пользователь с add-user.bat

Web.xml

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Admin Resource</web-resource-name>
        <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login.xhtml</form-login-page>
        <form-error-page>/error.xhtml</form-error-page>
    </form-login-config>
</login-config>

<security-role>
    <role-name>admin</role-name>
</security-role>

Автономный.xml

<login-module code="Remoting" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
<login-module code="RealmDirect" flag="required">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>

логин.xhtml

    <?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://primefaces.org/ui">
    <div class="center">
        <form method="POST" action="j_security_check" id="">
            <h:panelGrid id="panel" columns="2" border="1" cellpadding="4" cellspacing="4">
                <h:outputLabel for="j_username" value="Username:" />
                <input type="text" name="j_username" />
                <h:outputLabel for="j_password" value="Password:" />
                <input type="password" name="j_password" />
                <h:panelGroup>
                    <input type="submit" value="Login" />
                </h:panelGroup>
            </h:panelGrid>
        </form>
    </div>
</ui:composition>

Так что все сработало... теперь я хочу использовать аутентификацию по базе данных... поэтому я меняю файл standalone.xml.

<login-module code="Database" flag="sufficient">
    <module-option name="dsJndiName" value="java:jboss/jsi/GarageXADataSource"/>
    <module-option name="principalsQuery" value="select encode(password, 'hex') from principal where username=?"/>
    <module-option name="rolesQuery" value="select r.role, r.role_group from role r inner join principal p on r.role = p.role where p.username=?"/>
    <module-option name="hashAlgorithm" value="SHA-512"/>
    <module-option name="hashEncoding" value="hex"/>
</login-module>

Я использую этот sql для вставки роли и пользователя в базу данных (PostgreSQL 9.3)

ВСТАВИТЬ В роль (роль, группа_ролей) ЗНАЧЕНИЯ («администратор», «Роли»);
ВСТАВИТЬ В принципал(имя пользователя, электронная почта, пароль, роль) ЗНАЧЕНИЯ('Крис', '[email protected]', дайджест('пароль', 'sha512'), 'админ');

Но логин не работает. Я не вижу ошибок в журнале. Я использовал этот подход раньше в AS 7.1.1, где он работал.

Спасибо за помощь.


person klind    schedule 10.03.2014    source источник


Ответы (5)


Во-первых, DatabaseServerLoginModule записывает журналы на уровень трассировки, поэтому вы должны установить уровни журнала org.jboss.security для трассировки в вашем standalone.xml следующим образом. Теперь вы должны увидеть ошибки в вашем server.log

<logger category="org.jboss.security">
    <level name="TRACE"/>
</logger>

Вам также необходимо добавить имя области в файл jboss-web.xml.

<jboss-web>
    <security-domain>java:/jaas/MyRealm</security-domain>
</jboss-web>

Вы не указали окружающие теги вокруг фрагмента конфигурации модуля входа в систему. У вас должно получиться что-то ниже этого. Имя области должно совпадать с именем в вашем файле web.xml.

<subsystem xmlns="urn:jboss:domain:security:1.0">
  <security-domains>  
    <security-domain name="MyRealm">  
       <authentication>  
         <login-module code="Database" flag="required">  
         ....
      </authentication>  
    </security-domain>  
  </security-domains>  
</subsystem> 

После того, как вы это сделаете, вы можете публиковать сообщения об ошибках из вашего server.log.

person Chris Ritchie    schedule 18.03.2014
comment
Я думаю, что ‹имя-области/› имеет значение только при использовании ‹auth-method›BASIC‹/auth-method›; при использовании ‹auth-method›FORM‹/auth-method› (как в случае OP) ‹realm-name/› игнорируется. - person Mikko Östlund; 30.10.2014
comment
@Микко Ты уверен? Я использую ‹auth-method›FORM‹/auth-method› и свою собственную область, определенную внутри тега ‹realm-name›. - person Chris Ritchie; 30.10.2014
comment
Достаточно уверен. Проведите эксперимент: напишите какой-нибудь случайный контент внутри тега ‹realm-name›, например. ‹имя-области›JD8dk3P‹/имя-области›. Я почти уверен, что ваш логин FORM будет работать нормально, несмотря на это изменение (конечно, учитывая, что он работал до изменения :-) - person Mikko Östlund; 30.10.2014
comment
@MikkoÖstlund Итак, я сделал, как вы сказали, и знаете что, я смог войти в систему! Я никогда этого не знал. Оказывается, он использует конфигурацию области из моего файла jboss-web.xml. Спасибо :) Ответ обновлен - person Chris Ritchie; 30.10.2014
comment
Спасибо! Какое облегчение, иначе мне было бы очень неловко. :-) Несколько дней назад я хотел разобраться в настройке безопасности веб-приложений, потому что меня раздражало наличие имени области в web.xml и имени домена безопасности в jboss-web.xml. Какая разница? Зачем дублировать информацию? Мое текущее понимание таково: 1. ‹имя_области› предназначено только для ‹auth-method›BASIC‹/auth-method› и ‹auth-method›DIGEST‹/auth-method›. Значение ‹realm-name›XYZ‹/realm-name› отправляется клиенту (браузеру) в заголовке WWW-Authenticate сервера... - person Mikko Östlund; 31.10.2014
comment
...(продолжение) ...HTTP-ответ, например: 'WWW-Authenticate: Basic realm=XYZ'; браузер обычно показывает XYZ пользователю во всплывающем окне входа в систему. Все это RFC 7235. - person Mikko Östlund; 31.10.2014

Проблема с постоянными «Ролями», вы должны указать именно так, как «Роли». Пример: Select role, 'Roles' from Role where roleId =

person Sergii.Oliinyk    schedule 29.04.2014

У меня была такая же проблема с Wildfly, поищите эту строку в вашем standalone.xml

<default-security-domain value="other"/>

И измените other на свой домен безопасности, в предыдущих версиях этот параметр не был необходим.

person Juan Diego    schedule 30.04.2014
comment
В моем случае это не помогло, мне пришлось установить правильное значение JAAS в домен безопасности в файле jboss-web.xml, иначе wildfly (8.1) будет жаловаться во время развертывания. - person cslotty; 27.11.2014

попробуйте добавить файл jboss-web.xml в папку WEB-INF:

<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee 
    http://www.jboss.org/j2ee/schema/jboss-web_6_0.xsd" version="6.0">
    <security-domain>java:/jaas/MyRealm</security-domain>
</jboss-web>
person hypery2k    schedule 01.09.2014

Я только что столкнулся с той же проблемой, но мне только что удалось ее исправить!

Проблема, кажется, в принципахQuery.

Согласно документации, вы должны указать "Роль" и "Группа ролей". " в принципах Query, и они должны точно совпадать с регистром.

Подготовленный оператор SQL для выполнения для сопоставления ролей. Это должно быть эквивалентно выбору «Роль», «Группа ролей» из «Роли», где PrincipalID=?, где «Роль» — это имя роли, а значение столбца «Группа ролей» всегда должно быть «Роли» с заглавной буквы R.

Я тоже ничего не видел, но я включил приведенный ниже тег (как сказал Крис) в своем файле standalone.xml, и теперь я могу видеть такие ошибки, как «неверный логин/пароль» в журналах.

<logger category="org.jboss.security">
    <level name="TRACE"/>
</logger>

Что я сделал, чтобы подтвердить, что сервер, по крайней мере, запрашивает базу данных, так это проверил журналы MySQL (в моем случае), чтобы увидеть, запрашивается ли он.

В общем, приведенная ниже конфигурация - это то, что работает для меня, и, кстати, кажется, что некоторые параметры модуля, такие как «hashEncoding», больше не используются (также согласно документам).

<security-domain name="example-jaas-realm">
    <authentication>
        <login-module code="Database" flag="required">
            <module-option name="dsJndiName" value="java:/jboss/datasources/TestDS"/>
            <module-option name="principalsQuery" value="select password as 'Password' from users where username=?"/>
            <module-option name="rolesQuery" value="select ur.rolename as 'Role', ur.rolename as 'RoleGroup' from users_roles ur, users u, roles r where r.rolename = ur.rolename and u.username = ?"/> 
        </login-module>
    </authentication>
</security-domain>

Изменить

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

    2014-03-20 02:03:23,116 TRACE [org.jboss.security] (default task-9) PBOX000200: Begin isValid, principal: org.wildfly.extension.undertow.security.AccountImpl$AccountPrincipal@c84b3766, cache entry: null
    2014-03-20 02:03:23,120 TRACE [org.jboss.security] (default task-9) PBOX000209: defaultLogin, principal: org.wildfly.extension.undertow.security.AccountImpl$AccountPrincipal@c84b3766
    2014-03-20 02:03:23,120 TRACE [org.jboss.security] (default task-9) PBOX000221: Begin getAppConfigurationEntry(example-jaas-realm), size: 4
    2014-03-20 02:03:23,120 TRACE [org.jboss.security] (default task-9) PBOX000224: End getAppConfigurationEntry(example-jaas-realm), AuthInfo: AppConfigurationEntry[]:
    [0]
    LoginModule Class: org.jboss.security.auth.spi.DatabaseServerLoginModule
    ControlFlag: LoginModuleControlFlag: required
    Options:
    name=principalsQuery, value=select password as 'Password' from users where username=?
    name=dsJndiName, value=java:/jboss/datasources/TestDS
    name=rolesQuery, value=select ur.rolename as 'Role', ur.rolename as 'RoleGroup' from users_roles ur, users u, roles r where r.rolename = ur.rolename and u.username = ?

    2014-03-20 02:03:23,120 TRACE [org.jboss.security] (default task-9) PBOX000236: Begin initialize method
    2014-03-20 02:03:23,120 TRACE [org.jboss.security] (default task-9) PBOX000262: Module options [dsJndiName: java:/jboss/datasources/TestDS, principalsQuery: select password as 'Password' from users where username=?, rolesQuery: select ur.rolename as 'Role', ur.rolename as 'RoleGroup' from users_roles ur, users u, roles r where r.rolename = ur.rolename and u.username = ?, suspendResume: true]
    2014-03-20 02:03:23,121 TRACE [org.jboss.security] (default task-9) PBOX000240: Begin login method
    2014-03-20 02:03:23,121 TRACE [org.jboss.security] (default task-9) PBOX000263: Executing query select password as 'Password' from users where username=? with username renann
    2014-03-20 02:03:23,123 TRACE [org.jboss.security] (default task-9) PBOX000241: End login method, isValid: true
    2014-03-20 02:03:23,123 TRACE [org.jboss.security] (default task-9) PBOX000242: Begin commit method, overall result: true
    2014-03-20 02:03:23,123 TRACE [org.jboss.security] (default task-9) PBOX000263: Executing query select ur.rolename as 'Role', ur.rolename as 'RoleGroup' from users_roles ur, users u, roles r where r.rolename = ur.rolename and u.username = ? with username renann
    2014-03-20 02:03:23,123 TRACE [org.jboss.security] (default task-9) PBOX000263: Executing query select ur.rolename as 'Role', ur.rolename as 'RoleGroup' from users_roles ur, users u, roles r where r.rolename = ur.rolename and u.username = ? with username renann
    2014-03-20 02:03:23,125 TRACE [org.jboss.security] (default task-9) PBOX000210: defaultLogin, login context: javax.security.auth.login.LoginContext@248d105d, subject: Subject(690838634).principals=org.jboss.security.SimplePrincipal@730498373(renann)org.jboss.security.SimpleGroup@1160321194(teste_role(members:teste_role))org.jboss.security.SimpleGroup@1160321194(admin_role(members:admin_role))org.jboss.security.SimpleGroup@1160321194(CallerPrincipal(members:renann))
    2014-03-20 02:03:23,125 TRACE [org.jboss.security] (default task-9) PBOX000201: End isValid, result = true

Вот мой web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <security-constraint>
        <display-name>Security Constraint Test Display Name</display-name>
        <web-resource-collection>
            <web-resource-name>Protected Area</web-resource-name>
            <url-pattern>/protected/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>HEAD</http-method>
            <http-method>POST</http-method>
            <http-method>PUT</http-method>
            <http-method>DELETE</http-method>
            <http-method>CONNECT</http-method>
            <http-method>OPTIONS</http-method>
            <http-method>TRACE</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>teste_role</role-name>
        </auth-constraint>
        <user-data-constraint>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>  
    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>example-jaas-realm</realm-name>
        <form-login-config>
            <form-login-page>/index.html</form-login-page>
            <form-error-page>/error.html</form-error-page>
        </form-login-config>
    </login-config>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <security-role>
        <role-name>teste_role</role-name>
    </security-role>
</web-app>
person Renann    schedule 20.03.2014
comment
Я думаю, что ‹имя-области/› имеет значение только при использовании ‹auth-method›BASIC‹/auth-method›; при использовании ‹auth-method›FORM‹/auth-method› ‹имя-области/› игнорируется. - person Mikko Östlund; 30.10.2014