tomcat 8: программный вход/аутентификация из сервлета

Страница регистрации пользователя. Когда пользователь нажимает кнопку SignUp, сервлет регистрирует этого пользователя, а затем должен выполнить вход и перенаправить на главную страницу.

Я пробовал http://anydoby.com/jblog/en/133, но это не сработает.

пытался

if ( request.getUserPrincipal() == null ) {
  request.getSession(); // create session before logging in
  request.login( username, password );
}

Нужно ли что-то делать с сессией? Как войти/аутентифицироваться из кода, а затем перенаправить на страницу?


person CodeGust    schedule 27.03.2015    source источник
comment
Вопрос мне не ясен. Вы ссылаетесь на статью, которой 6 лет, и описываете скорее взлом Tomcat, чем обычное решение. Так что мне непонятно, что вы хотите получить. Более того, кажется, вы все знаете. Чтобы войти из кода, используйте request.login(имя пользователя, пароль). Для перенаправления на страницу сделайте редирект как обычно.   -  person michaldo    schedule 28.03.2015
comment
@michaldo Проблема в том, что ничего не происходит. getServletContext().getRequestDispatcher("/pages/Admin.jsp").forward(request, response); Когда я нажимаю кнопку «Назад» в браузере, она просто показывает страницу входа в систему, в то время как она всегда перенаправляет на главную страницу, когда пользователь входит в систему.   -  person CodeGust    schedule 30.03.2015
comment
что означает «пока он всегда перенаправляет на главную страницу, когда пользователь вошел в систему»?   -  person michaldo    schedule 31.03.2015
comment
@michaldo Когда пользователь нажимает кнопку входа, страница перенаправляется на главную страницу, начинается сеанс. Даже если кнопка «Назад» в браузере нажата или URL-адрес страницы входа введен вручную, пользователю отображается главная страница. Это означает, что если пользователь вошел в систему, он не должен видеть страницу входа. Но когда я пытаюсь войти в систему из кода после регистрации, пользователь все еще может перейти на страницу входа, которая не вошла в систему.   -  person CodeGust    schedule 31.03.2015


Ответы (1)


Трудно ответить на вопрос, потому что я вижу некоторую непоследовательность в ваших объяснениях или они неполны. Однако я рискну угадать истину и дам ответ.

Процесс входа по умолчанию хорошо описан в https://stackoverflow.com/a/9530082. Вы открываете веб-страницу, сервер отображает форму входа. Когда вы отправляете пароль, сервер открывает страницу. Вот почему кнопка «Назад» работает: вы дважды зашли на одну и ту же страницу, но в первый раз отобразилась форма входа. Когда вы нажимаете «Назад» после входа в систему, вы возвращаетесь на ту же страницу (тот же URL-адрес).

Вы написали: "Даже если (...) URL-адрес страницы входа вводится вручную, пользователю показывается главная страница." Это невозможно, если только вы не сделали собственный код, который, если пользователь уже регистрируется, затем отображается главная страница. По умолчанию спецификация сервлета не блокирует отображение страницы входа для уже зарегистрированных.

Поэтому, если у вас есть защита от display-login-form-for-logged, просто примените ее против display-signup-form-for-logged.

Самое простое решение, которое я проверил, — это сервлет перед формой регистрации. Если пользователь не зарегистрирован, перейдите в JSP с формой регистрации. Если пользователь вошел в систему, перенаправить на главную страницу. Важно добавить resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");, иначе сервлет по кнопке «Назад» не будет вызываться, а браузер будет отображать кешированную форму.

Если вы все еще заинтересованы, дайте мне знать, и я поделюсь примером github. Но я думаю, что моего объяснения достаточно, чтобы понять и победить вашу проблему. (Мой пример довольно не идеален, потому что простая аутентификация сервлета сложна, и я привык к безопасности Spring)

person michaldo    schedule 01.04.2015
comment
Спасибо! stackoverflow.com/ вопросов/28510904/ - так работает мой основной логин. при нажатии кнопки регистрации данные формы отправляются сервлету, он записывает их в базу данных, а затем использует этот хешированный пароль и имя пользователя для входа в систему (роль не требуется?), Затем сервлет перенаправляет страницу. - вот как это должно работать. - person CodeGust; 03.04.2015