2017-01-02 5 views
0

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

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

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

standalone.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> 

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

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

Спасибо

ответ

2

Если дополнительные проверки включают запрос базы данных в той же базе данных, что и через 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.LoginModule. Обратите внимание, что значение атрибута login-moduleflag изменилось на required. Эти модули выполняются один за другим, и оба должны преуспеть для успешной попытки аутентификации.

+0

Именно то, что я искал. благодаря – Smolda

Смежные вопросы