jboss 领域的附加逻辑

Additional logic to jboss realm

应用程序的当前设置是带有 JBoss 服务器的 JSF。我想在导航到登录失败页面的现有领域认证中包含额外的逻辑。从 Realm (java) 寻找使成功的 pricinpal 无效的东西。

场景:用户输入了正确的密码并登录,但有某些情况不允许他登录。

配置:

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>

我几乎没有什么想法,尽管很容易改变,但我认为这些想法并不容易。

谢谢

如果您的额外检查涉及与可通过 java:/datasource 访问的同一数据库中的数据库查询,那么您可能只需要对 principalsQuery.

进行更复杂的查询

或者,您可以实现一个执行附加逻辑的 servlet 过滤器。如果测试失败并且不应向用户提供访问权限,则您调用 HttpServletRequest.logout() 然后重定向到登录-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。这些模块一个接一个地执行,并且都必须成功才能使身份验证尝试成功。