如何解决JAAS,从容器外部进行登录
| 我有一个使用JAAS的应用程序,我需要从旧版进行外部登录,因此我用下面的代码编写了一个Servlet,它可以正常工作,但是当我再次提交时,JAAS再次尝试进行身份验证并失败,并且用户重定向到登录页面。 这是doPost方法:protected void doPost(HttpServletRequest req,HttpServletResponse resp)
throws servletexception,IOException {
NfWebCallbackHandler callbackHandler = new NfWebCallbackHandler(req);
LoginContext loginContext = null;
boolean loginSuccess = true;
try {
loginContext = new LoginContext(\"MyLoginContext\",callbackHandler);
loginContext.login();
} catch (LoginException e) {
loginSuccess = false;
Requestdispatcher dispatcher = req
.getRequestdispatcher(\"/login.jsf\");
dispatcher.forward(req,resp);
e.printstacktrace();
}
if (loginSuccess) {
Requestdispatcher dispatcher = req.getRequestdispatcher(req
.getParameter(\"targetUrl\"));
dispatcher.forward(req,resp);
}
}
任何想法都欢迎!谢谢!
解决方法
当您在容器权限范围之外(或至少在容器无法识别的方式中)使用JAAS登录模块时,容器将不会意识到以下事实:主题和主体集(与主题相关联)是由容器存储和管理。
当您使用一种容器管理的身份验证方案时,容器实际上以对开发人员完全不透明的方式将主题存储在Session实现类中(至少在Tomcat 6中是这样)。在会话对象上使用
getAttribute()
不会返回主题,也不能使用setAttribute()
覆盖主题。需要时,可以从此会话字段中检索主题,并由容器用于各种目的;例如,当您在HttpServletRequest
对象上调用getUserPrincipal()
或getRemoteUser()
时,实际上与主题关联的Principal会返回结果。
如果您需要让容器来完成所有这些繁重的工作,则需要将JAAS登录模块与容器管理的身份验证方案结合使用。如果您不想这样做,则需要在会话期间“记住”主题和主体。不要忘记,所有这些都必须以安全的方式完成。
, 我忘记为这种情况注册我的解决方案,我使用了此类:
org.jboss.web.tomcat.security.login.WebAuthentication
我写了这样的东西:
WebAuthentication webAuthentication = new WebAuthentication();
req.getSession().setAttribute(\"webAuthentication\",webAuthentication);
我不记得我在哪里找到的,但是非常有用!
Thanx Vineet Reynolds,唯一一位试图帮助我的人
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。