Java JSF2 web应用程序(JBoss)中自定义JAAS LoginModule的编程登录
我的服务器端JBoss EAP 6.2.0 SecurityDomain上有一个CustomLogin模块。此自定义LoginModule需要三个回调处理程序:NameCallback Java标准、PasswordCallback Java标准和一个由我自己实现的额外OtpCallback,用于一次性密码 现在我想通过JSF2.1Web应用程序登录到这个模块。我知道这通常可以通过表单登录、基本登录或通过登录实现。但是他们都不允许我指定用户名、密码和otp值。它们只允许输入用户名和密码 因此,我正在寻找一种类似于HttpServletRequestMethod的身份验证方法,同时能够提供三个凭据 非常感谢你的帮助 注意: 我已经试着用过了Java JSF2 web应用程序(JBoss)中自定义JAAS LoginModule的编程登录,java,security,jsf,jboss,jaas,Java,Security,Jsf,Jboss,Jaas,我的服务器端JBoss EAP 6.2.0 SecurityDomain上有一个CustomLogin模块。此自定义LoginModule需要三个回调处理程序:NameCallback Java标准、PasswordCallback Java标准和一个由我自己实现的额外OtpCallback,用于一次性密码 现在我想通过JSF2.1Web应用程序登录到这个模块。我知道这通常可以通过表单登录、基本登录或通过登录实现。但是他们都不允许我指定用户名、密码和otp值。它们只允许输入用户名和密码 因此,我
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();
这甚至调用了我的服务器端自定义登录模块,但不知何故,登录没有传播到webapp和ejb。这似乎是不可能的,至少我无法将JAAS主体传播或绑定到HttpSession 最后,我将OTP和密码打包成一个字符串,并将两个参数username和password+OTP传递给 这不是最优雅的解决方案,但它很有效