[英]Passing 'password expiration' information from Wildfly Server authentication module to remote EJB client
我们有一个Wildfly 10 JEE应用程序和一个使用远程EJ调用与服务器通信的java胖客户端。 使用wildfly服务器中的自定义登录模块完成身份验证。
现在我们需要使用密码到期的概念来增强此登录模块。 每当密码过期时,用户必须在登录过程中更改其密码。 登录模块使用JAAS回调和JAAS回调处理程序。 据我所知,我们可以使用LoginModule中的javax.security.auth.callback.TextInputCallback在执行登录时从用户请求新密码。
它如何与远程处理集成。 我们的胖客户端如何接收TextInputCallback以提供请求的输入? 我想我们必须在客户端注册一个自定义CallbackHandler来处理回调,但我没有找到任何关于如何使用Wildfly执行此操作的文档。 任何人都可以给我一些关于如何解决这个问题的文件或样本的提示吗?
在我看来,你走向了错误的方向。 使用将密码更改放入LoginModule的方法存在一些问题。
TextInputCallback
来索取新护照至少是奇怪的。 TextInputCallback
旨在向用户询问常规文本而不是密码,例如第二个身份验证因素,如(基于时间的)PIN实现CallbackHandler
的客户端不知道它是一个密码,当在密码上显示时,该密码可能必须被屏蔽。 scren。 请记住,通常对于密码更改,您需要经过身份验证/授权的用户,该用户必须通过重新输入其旧密码来确认密码更改,并且通常还提供用户可以重新输入其新密码的第二个字段。 只有一个xxxCallback
似乎还不够。
即使一个人不应该使用Exceptions
作为控制流我建议使用CredentialExpiredException
来通知客户端用户必须更改密码。 这也是Oracle在其中一个WebLogic JAAS示例中执行此操作的方式
如果您仍然希望/需要将其放入自定义LoginModule
那么我建议您定义自己的自定义Callback
,例如PasswordChangeCallback
或ConfirmPasswordCallback
, NewPasswordCallback
, VerifyNewPasswordCallback
您只需将它们添加到自定义LoginModule
,无需注册它们。 请记住,标准客户端可能会遇到这些额外回调问题。 然后,您的客户端必须实现相应的CallbackHandler
。
在JAAS中,有两种方法可以通过配置自定义默认CallbackHandler来自定义使用的CallbackHander
*
可以在auth.login.defaultCallbackHandler安全属性中指定默认的CallbackHandler类实现。 可以在名为/lib/security/java.security的文件中的Java安全属性文件中设置security属性。 是指java.home系统属性的值,并指定安装JRE的目录。
或者通过作为参数传递给LoginContext
的构造函数。 LoginContext
提供了两个接受CallbackHandler
构造函数
public LoginContext(String name, CallbackHandler callbackHandler)
throws LoginException
public LoginContext(String name, Subject subject,
CallbackHandler callbackHandler) throws LoginException
它如何与删除集成?
它应该与您已经这样做的方式相同。 没有太大区别。
我们的胖客户端如何收到
TextInputCallback
?
通过CallbackHandler
接口类似于PasswordCallback
。 您已经提到登录模块使用CallbackHandler
。
void handle(Callback[] callbacks)
如果您想知道如何实现handle
方法, CallbackHandler
API文档还提供了CallbackHandler
handle
方法的实现示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.