将 'password expiration' 信息从 Wildfly 服务器身份验证模块传递到远程 EJB 客户端
Passing 'password expiration' information from Wildfly Server authentication module to remote EJB client
我们有一个 Wildfly 10 JEE 应用程序和一个使用远程 EJ 调用与服务器通信的 java 胖客户端。身份验证是使用 wildfly 服务器中的自定义登录模块完成的。
现在我们需要用密码过期的概念来增强这个登录模块。每当密码过期时,用户必须在登录过程中更改其密码。登录模块使用 JAAS 回调和 JAAS 回调处理程序。据我所知,我们可以在登录模块中使用 javax.security.auth.callback.TextInputCallback 在执行登录时向用户请求新密码。
这如何与远程处理集成。我们的胖客户端如何接收 TextInputCallback 以提供请求的输入?我想我们必须在客户端注册一个自定义的 CallbackHandler 来处理回调,但我还没有找到任何关于如何使用 Wildfly 执行此操作的文档。任何人都可以给我关于此类文档的提示或有关如何解决此问题的示例吗?
我认为你走错了方向。
使用您将密码更改放入 LoginModule 的方法存在一些问题。
- 用户登录通常被认为是 "safe" 过程,即过程 "without" 副作用。
- 使用
TextInputCallback
来申请新护照至少很奇怪。
TextInputCallback
是为了要求用户提供常规文本而不是密码,例如第二个身份验证因素,如(基于时间的)PIN
执行 CallbackHandler
的客户端不知道它是一个密码,在屏幕上显示时可能必须屏蔽该密码。
- 该方法违反了 LoginModule 的单一职责原则 - LoginModule 负责登录/验证用户。
请记住,通常要更改密码,您需要经过身份验证/授权的用户,该用户必须通过重新输入旧密码来确认密码更改
并且通常还提供第二个字段,用户可以在其中重新输入他的新密码。一个xxxCallback
好像不够用
即使是控制流也不应该使用 Exceptions
我建议使用 CredentialExpiredException
来向客户端发出用户必须更改的信号
密码。这也是 Oracle 在 WebLogic JAAS Examples
之一中的做法
在我的所有评论之后,如果您仍然想要/需要将其放入自定义 LoginModule
,那么我建议您定义自己的自定义 Callback
s
例如 PasswordChangeCallback
或 ConfirmPasswordCallback
、NewPasswordCallback
、VerifyNewPasswordCallback
您只需将它们添加到自定义项即可 LoginModule
,无需注册。请记住,标准客户端可能会遇到这些额外回调的问题。
然后您的客户必须实施相应的 CallbackHandler
.
在 JAAS 中,有两种方法可以自定义使用的 CallbackHander
* 通过配置自定义默认 CallbackHandler
来自CallbackHandler API documentaion
A default CallbackHandler class implementation may be specified in the
auth.login.defaultCallbackHandler security property. The security
property can be set in the Java security properties file located in
the file named /lib/security/java.security.
refers to the value of the java.home system property, and specifies
the directory where the JRE is installed.
或者作为参数传递给 LoginContext
的构造函数。
LoginContext
提供了两个接受 CallbackHandler
的构造函数
public LoginContext(String name, CallbackHandler callbackHandler)
throws LoginException
public LoginContext(String name, Subject subject,
CallbackHandler callbackHandler) throws LoginException
见LoginContext API Documentation
How does it integrate with removing?
应该和你已经做的一样。差别不大。
How does our fat client receive the TextInputCallback
?
通过 CallbackHandler
类似于 PasswordCallback
的界面。您提到登录模块使用 CallbackHandler
.
void handle(Callback[] callbacks)
如果您想知道如何实现 handle
方法,CallbackHandler
API Documentation 还提供了 CallbackHandler
handle
方法的实现示例。
我们有一个 Wildfly 10 JEE 应用程序和一个使用远程 EJ 调用与服务器通信的 java 胖客户端。身份验证是使用 wildfly 服务器中的自定义登录模块完成的。
现在我们需要用密码过期的概念来增强这个登录模块。每当密码过期时,用户必须在登录过程中更改其密码。登录模块使用 JAAS 回调和 JAAS 回调处理程序。据我所知,我们可以在登录模块中使用 javax.security.auth.callback.TextInputCallback 在执行登录时向用户请求新密码。
这如何与远程处理集成。我们的胖客户端如何接收 TextInputCallback 以提供请求的输入?我想我们必须在客户端注册一个自定义的 CallbackHandler 来处理回调,但我还没有找到任何关于如何使用 Wildfly 执行此操作的文档。任何人都可以给我关于此类文档的提示或有关如何解决此问题的示例吗?
我认为你走错了方向。 使用您将密码更改放入 LoginModule 的方法存在一些问题。
- 用户登录通常被认为是 "safe" 过程,即过程 "without" 副作用。
- 使用
TextInputCallback
来申请新护照至少很奇怪。TextInputCallback
是为了要求用户提供常规文本而不是密码,例如第二个身份验证因素,如(基于时间的)PIN 执行CallbackHandler
的客户端不知道它是一个密码,在屏幕上显示时可能必须屏蔽该密码。 - 该方法违反了 LoginModule 的单一职责原则 - LoginModule 负责登录/验证用户。
请记住,通常要更改密码,您需要经过身份验证/授权的用户,该用户必须通过重新输入旧密码来确认密码更改
并且通常还提供第二个字段,用户可以在其中重新输入他的新密码。一个xxxCallback
好像不够用
即使是控制流也不应该使用 Exceptions
我建议使用 CredentialExpiredException
来向客户端发出用户必须更改的信号
密码。这也是 Oracle 在 WebLogic JAAS Examples
在我的所有评论之后,如果您仍然想要/需要将其放入自定义 LoginModule
,那么我建议您定义自己的自定义 Callback
s
例如 PasswordChangeCallback
或 ConfirmPasswordCallback
、NewPasswordCallback
、VerifyNewPasswordCallback
您只需将它们添加到自定义项即可 LoginModule
,无需注册。请记住,标准客户端可能会遇到这些额外回调的问题。
然后您的客户必须实施相应的 CallbackHandler
.
在 JAAS 中,有两种方法可以自定义使用的 CallbackHander
* 通过配置自定义默认 CallbackHandler
来自CallbackHandler API documentaion
A default CallbackHandler class implementation may be specified in the auth.login.defaultCallbackHandler security property. The security property can be set in the Java security properties file located in the file named /lib/security/java.security. refers to the value of the java.home system property, and specifies the directory where the JRE is installed.
或者作为参数传递给 LoginContext
的构造函数。
LoginContext
提供了两个接受 CallbackHandler
public LoginContext(String name, CallbackHandler callbackHandler)
throws LoginException
public LoginContext(String name, Subject subject,
CallbackHandler callbackHandler) throws LoginException
见LoginContext API Documentation
How does it integrate with removing?
应该和你已经做的一样。差别不大。
How does our fat client receive the
TextInputCallback
?
通过 CallbackHandler
类似于 PasswordCallback
的界面。您提到登录模块使用 CallbackHandler
.
void handle(Callback[] callbacks)
如果您想知道如何实现 handle
方法,CallbackHandler
API Documentation 还提供了 CallbackHandler
handle
方法的实现示例。