JAAS,从容器外部登录

时间:2011-06-16 15:35:01

标签: java 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);
    }

}

欢迎任何想法!谢谢!

2 个答案:

答案 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,唯一一个试图帮助我嘿嘿的人