0

我正在开发为 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;。但是在我的网络应用程序中,用户名保持为空。 httpRequest.getUserPrincipal().getName()返回空字符串。此外,如果我调用 EJB,我会从 sessionContext.getCallerPrincipal().getName().

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

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

4

1 回答 1

1

问题出在登录模块的主题对象中。在该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);

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

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

于 2013-01-29T09:00:03.563 回答