在jBoss自定义登录模块中设置用户名

时间:2013-01-28 11:08:05

标签: java-ee jboss

我正在开发具有jboss实现的自定义登录模块的企业应用程序。它具有基于表单的安全登录,用户提供用户名和密码。在登录模块中,将根据数据库检查凭据,并完成一些附加检查。现在我想让用户通过一次性令牌(一些哈希字符串,例如:EF223222131)登录,我想通过电子邮件将其作为URL发送给他:applicationServer:8080/myApplication/login2.jsp?hash=EF223222131。 在页面login2.jsp上,我使用相同的表单进行基于表单的身份验证,并将用户名和密码留空,并添加字段哈希。隐藏所有字段,并在页面加载时触发javascript表单提交。 在登录模块中,我设法得到哈希:

HttpServletRequest httpRequest = 
    (HttpServletRequest)PolicyContext.getContext("javax.servlet.http.HttpServletRequest");
    String hashV = httpRequest.getParameter("hashValue");

然后我从数据库集标识和角色中获取用户,并在各自的方法中获得loginOk = true;commitOk = true;。 但在我的Web应用程序中,用户名保持空白 httpRequest.getUserPrincipal().getName()返回空字符串。此外,如果我调用EJB,我会从sessionContext.getCallerPrincipal().getName()获取空字符串。

有没有办法从Login模块设置这些值?或者是否有另一种通过URL中的令牌登录的方法?

我正在使用jboss 4.0.3SP1和java 1.4.2,但我认为它应该与新配置中的相同。

1 个答案:

答案 0 :(得分:1)

问题出在登录模块的Subject对象中。在commit()方法中,有一个定义主题对象的代码:

if(!subject.getPrincipals().contains(identity)) {
        subject.getPrincipals().add(identity);
}
Group g = new SimpleGroup("Roles");
g.addMember(new SimplePrincipal((String) options.get("defaultRole")));
subject.getPrincipals().add(g);

此外我还添加了:

Group callerPrincipal = new SimpleGroup("CallerPrincipal");
callerPrincipal.addMember(identity);
subject.getPrincipals().add(callerPrincipal);

新的用户名在会话中可用(来自servlet中的httpRequest.getUserPrincipal().getName()和EJB中的sessionContext.getCallerPrincipal().getName()

我从链接中找到了解决方案:Jboss community