我有一个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);
}
}
欢迎任何想法!谢谢!
答案 0 :(得分:2)
当您在容器范围之外使用JAAS登录模块时(或者至少在容器无法识别的方式中),容器将不会意识到主题和主体集(与主题)将由容器存储和管理。
当您使用其中一个容器管理的身份验证方案时,容器实际上将主题存储在Session实现类中(至少在Tomcat 6中,这是真的),其方式对开发人员来说是完全不透明的;在会话对象上使用getAttribute()
永远不会返回主题,也不能使用setAttribute()
覆盖主题。在需要时,从该会话字段中检索主题并由容器用于各种目的;例如,当您在getUserPrincipal()
对象上调用getRemoteUser()
或HttpServletRequest
时,与Subject关联的Principal实际上用于返回结果。
如果您需要让容器为您完成所有这些繁重工作,那么您需要将JAAS Login模块与容器管理的身份验证方案结合使用。如果你不想这样做,那么你需要在会话期间“记住”主题和校长;不要忘记,所有这一切都必须以安全的方式完成。
答案 1 :(得分:0)
我忘记为这个案例注册我的解决方案,我使用了这个类:
org.jboss.web.tomcat.security.login.WebAuthentication
我写了类似的东西: WebAuthentication webAuthentication = new WebAuthentication();
req.getSession().setAttribute("webAuthentication", webAuthentication);
我不记得我在哪里找到了这个,但非常有用!
Thanx Vineet Reynolds,唯一一个试图帮助我嘿嘿的人