Дополнительная логика в области jboss

Текущая настройка приложения — JSF с сервером JBoss. Я хотел бы включить дополнительную логику в существующую аутентификацию области, которая переходит на страницу с ошибкой входа. Ищете что-то, что аннулирует успешный pricinpal от Realm (java).

Сценарий: Пользователь ввел правильный пароль и логин, но есть определенные условия, которые не позволяют ему войти в систему.

Конфигурации:

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

<security-domain name="login">
    <authentication>
        <login-module code="Database" flag="sufficient">
            <module-option name="dsJndiName" value="java:/datasource"/>
            <module-option name="principalsQuery" value="query"/>
            <module-option name="rolesQuery" value="query"/>
            <module-option name="hashAlgorithm" value="???"/>
            <module-option name="hashEncoding" value="???"/>
            <module-option name="principalClass" value="org.jboss.security.SimplePrincipal"/>
        </login-module>
    </authentication>
</security-domain>

jboss-web.xml

<jboss-web>
   <security-domain>login</security-domain>
</jboss-web>

лица-config.xml

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>ApplicationRealm</realm-name>
    <form-login-config>
        <form-login-page>login.html</form-login-page>
        <form-error-page>login-error.html</form-error-page>
    </form-login-config>
</login-config>

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

  • Удалить участника из сеанса и установить параметр, который проверяется на странице входа (только для одной страницы входа)
  • Написать собственный модуль входа в область

Спасибо


person Smolda    schedule 02.01.2017    source источник


Ответы (1)


Если ваши дополнительные проверки включают запрос к той же базе данных, которая доступна через java:/datasource, то, возможно, все, что вам нужно, это более сложный запрос для principalsQuery.

В качестве альтернативы вы можете реализовать фильтр сервлета, который выполняет дополнительную логику. Если тест не пройден и пользователю не должен быть предоставлен доступ, вы вызываете HttpServletRequest.logout(), а затем перенаправить на страницу login-error.html.

Однако может быть более элегантно сделать это, изменив конфигурацию security-domain и добавив второй модуль входа в систему, содержащий дополнительную логику:

<security-domain name="login">
    <authentication>
        <login-module code="Database"
                      flag="required">
            <module-option name="dsJndiName" value="java:/datasource"/>
            <module-option name="principalsQuery" value="query"/>
            <module-option name="rolesQuery" value="query"/>
            <module-option name="hashAlgorithm" value="???"/>
            <module-option name="hashEncoding" value="???"/>
            <module-option name="principalClass" value="org.jboss.security.SimplePrincipal"/>
        </login-module>
        <login-module code="com.yourorg.yourapp.ExtendedLoginCheck"
                      flag="required"
                      module="name-of-wildfly-module-containing-ExtendedLoginCheck">
            <module-option name="your module option" value="your module option value" />
            ...
        </login-module>
    </authentication>
</security-domain>

где com.yourorg.yourapp.ExtendedLoginCheck реализует javax.security.auth .spi.ЛогинМодуле. Обратите внимание, что значение атрибута login-module flag изменилось на required. Эти модули выполняются один за другим, и оба должны успешно выполнить попытку аутентификации.

person Steve C    schedule 02.01.2017
comment
Именно то, что я искал. Спасибо - person Smolda; 02.01.2017