当前的应用程序设置是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>
我有一些想法,尽管变化很小,但我并不容易看到。
谢谢
答案 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
。这些模块一个接一个地执行,两者都必须成功才能使验证尝试成功。