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,唯一一位试图帮助我的人