我的服务器端 JBoss EAP 6.2.0 SecurityDomain 上有一个 CustomLogin 模块。这个自定义LoginModule需要三个CallbackHandler:NameCallback(Java标准)、PasswordCallback(Java标准)和一个额外的OtpCallback(由我自己实现,用于一次性密码)。
我现在想通过 JSF 2.1 Web 应用程序登录到此模块。我知道这通常可以通过 FORM 登录、BASIC 登录或通过 HttpServletRequest#login 登录来实现。 。 但它们都不允许我指定用户名、密码和 otp 值。它们只允许输入用户名和密码。
因此,我正在寻找一种类似于 HttpServletRequestMethod 的身份验证方法,同时能够提供三个凭据。
非常感谢您的帮助!
注意: 我已经尝试过使用
LoginContext lc = new LoginContext("MyOtpSecurityDomain", new CallbackHandler() {
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for( Callback callback : callbacks ) {
if( callback instanceof NameCallback ){
NameCallback nc = (NameCallback) callback;
nc.setName(username);
} else if ( callback instanceof PasswordCallback ) {
PasswordCallback pc = (PasswordCallback) callback;
pc.setPassword(password.toCharArray());
} else if ( callback instanceof OtpCallback ) {
OtpCallback oc = (OtpCallback) callback;
oc.setOtp(otp);
}
}
}
});
lc.login();
这甚至会调用我的服务器端自定义登录模块,但不知何故,登录不会传播到 Web 应用程序和 EJB。
最佳答案
这似乎是不可能的,至少我无法将 JAAS 主题传播或绑定(bind)到 HttpSession。
我最终将 OTP 和密码打包到一个字符串中,并将两个参数 username 和 (password+otp) 传递给 HttpServletRequest#login(java.lang.String username, java.lang.String password) .
这不是最优雅的解决方案,但它确实有效。
关于java - 以编程方式登录到 JSF2 Web 应用程序中的自定义 JAAS LoginModule (JBoss),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21773997/