jboss领域的附加逻辑

时间:2017-01-02 11:04:05

标签: java-ee wildfly post-processing security-constraint

当前的应用程序设置是JSF和JBoss服务器。我想在现有的领域认证中包含额外的逻辑,导航到登录失败的页面。寻找从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>

faces-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并设置在登录页面上检查的参数(仅限单一登录页面)
  • 编写自定义领域登录模块

谢谢

1 个答案:

答案 0 :(得分: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。这些模块一个接一个地执行,两者都必须成功才能使验证尝试成功。