JAAS, делая логин извне контейнера - PullRequest
1 голос
/ 16 июня 2011

У меня есть приложение с JAAS, и мне нужно сделать внешний вход в систему из прежней версии, поэтому я написал сервлет с этим кодом ниже, он работает нормально, но когда я делаю еще одну отправку, 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 ]

2 голосов
/ 16 июня 2011

Когда вы используете Модуль входа в систему JAAS вне области действия контейнера (или, по крайней мере, в манере, неузнаваемой для контейнера), контейнер не будет знать о том факте, что Субъект и набор Принципалов (связанных сsubject) должны храниться и управляться контейнером.

Когда вы используете одну из схем аутентификации, управляемой контейнером, контейнер фактически сохраняет субъект в классе реализации Session (по крайней мере, в Tomcat 6 этоправда), способом, который полностью непрозрачен для разработчика;использование getAttribute() в объекте сеанса никогда не вернет субъекта, и ни один из них не может использовать setAttribute() для переопределения субъекта.При необходимости субъект извлекается из этого поля сеанса и используется контейнером для различных целей;например, когда вы вызываете getUserPrincipal() или getRemoteUser() для объекта HttpServletRequest, субъект, связанный с субъектом, фактически используется для возврата результата.

Если вам нужно, чтобы контейнер выполнял всеэто тяжело для вас, тогда вам нужно использовать модуль входа в систему JAAS вместе со схемой управляемой контейнером аутентификации.Если вы не хотите идти по этому пути, тогда вам нужно «запомнить» тему и принципы на время сеанса;не забывайте, все это должно быть сделано безопасным способом.

0 голосов
/ 03 августа 2011

Я забыл зарегистрировать свое решение для этого случая, я использовал этот класс:

org.jboss.web.tomcat.security.login.WebAuthentication

я написал что-то вроде этого:

        WebAuthentication webAuthentication = new WebAuthentication();
        req.getSession().setAttribute("webAuthentication", webAuthentication);

Я не помню, где я нашел это, но было очень полезно!

Спасибо Винс Рейнольдс, единственный, кто пытался мне помочь, хе-хе

...