程序化登录JSF2 Web应用程序(JBoss)中的自定义JAAS LoginModule

时间:2014-02-14 08:13:35

标签: java security jsf jboss jaas

我的服务器端JBoss EAP 6.2.0 SecurityDomain上有一个CustomLogin模块。这个Custom LoginModule需要三个CallbackHandler:NameCallback(Java标准),PasswordCallback(Java标准)和一个额外的OtpCallback(由我自己实现,一次性密码)。

我现在想通过JSF 2.1 Web应用程序登录此模块。我知道这通常可以通过FORM登录,BASIC登录或通过HttpServletRequest#login登录。 但所有这些都不允许我指定用户名,密码和otp-value。他们只允许用户名和密码。

因此,我正在寻找一种方法来验证HttpServletRequestMethod,同时能够提供三个凭证。

非常感谢您的帮助!

N.B .: 我已经尝试过使用

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。

1 个答案:

答案 0 :(得分:0)

似乎这是不可能的,至少我无法将JAAS主题传播或绑定到HttpSession。

我最终将OTP和密码打包成String并将两个参数username和(password + otp)传递给HttpServletRequest#login(java.lang.String username, java.lang.String password)

不是最优雅的解决方案,但它确实有效。