0

当前应用程序的设置是带有 JBoss 服务器的 JSF。我想在导航到登录失败页面的现有领域身份验证中包含其他逻辑。寻找使 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>

尽管进行了简单的更改,但我的想法很少,我认为这些想法并不容易。

  • 从会话中删除主体并设置登录页面上检查的参数(仅限单个登录页面)
  • 编写自定义领域登录模块

谢谢

4

1 回答 1

2

如果您的附加检查涉及与可访问的数据库相同的数据库中的数据库查询,java:/datasource那么您可能只需要一个更复杂的principalsQuery.

或者,您可以实现一个执行附加逻辑的 servlet 过滤器。如果测试失败并且不应该向用户提供访问权限,那么您调用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-module flag属性值已更改为required。这些模块一个接一个地执行,并且两者都必须成功才能使身份验证尝试成功。

于 2017-01-02T13:07:23.740 回答