Spring MVC странное поведение - PullRequest
1 голос
/ 18 января 2012

У меня есть метод, который обрабатывает запрос с URI "/ home".Этот запрос генерируется после успешного входа в систему.Вот небольшой код для поддержки моей ситуации:

<security:form-login login-processing-url="/static/j_spring_security_check"
login-page="/login" authentication-failure-url="/login?login_error=t"
default-target-url="/home"/> 

Тело метода демонстрирует то, чего я пытаюсь достичь:

String userMail = SecurityContextHolder.getContext().
    getAuthentication().getName();
logger.info(userMail);

Person p = userService.retrieveUserByEmail(userMail);
session.setAttribute("person", p);

return "user/home";

Этот бит важен, поскольку человек p используется какисточник данных для других запросов.

Теперь проблема.Я не знаю, является ли это свойством Google Chrome, но по какой-то причине браузер запоминает запрос, который вы сделали перед входом в систему, и вместо того, чтобы выполнить / home запрос после успешной процедуры входа, он генерирует предыдущийзапрос в обход этого / home gate, что приводит к исключению нулевого указателя, так как человек p никогда не был настроен, так как сессия не была заполнена запросом / home.

Я знаю, что для других запросов я должен выполнить проверку, но ямне не нравится идея позволить пользователю генерировать любой запрос без предварительного прохождения / home.

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

  1. запросить запрос, который, как вы знаете, существует, например: myApp / nameOfSomething / viewThisSomething - вы попадете на страницу входа в систему, как и ожидалось (вы должны пройти проверку подлинности, чтобы запрос был принят)

  2. вы вводите правильные учетные данные и вместо перехода к default-target-url = "/ home" вы автоматически делаете предыдущийequest myApp / nameOfSomething / viewThisSomething без заполнения сеанса необходимыми данными и, как следствие, исключения nullpointer.

Что еще интересно, регистратор показывает почту, поэтому может быть, что они оба выполненыв то же время, но / home запрос медленнее - может ли это произойти?

Я разрешаю ситуацию другим методом, проверяя, имеет ли значение null, и заставляя вернуться в / home, который работает, как и ожидалось, но я не справился с управлениеми не нравится, когда пользователь делает то, что ему не предназначено.

Спасибо за ваше время,

1 Ответ

2 голосов
/ 18 января 2012

Это не ошибка, это особенность. Гораздо удобнее позволить пользователю идти туда, куда он хочет, после входа в систему, чем заставлять его перейти на домашнюю страницу. Он мог добавить в закладки одну из защищенных страниц или просто просмотреть некоторые незащищенные страницы, содержащие ссылку на защищенную страницу.

С http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-form-target:

Если при входе в форму не происходит попытки доступа к защищенному ресурс, опция default-target-url вступает в игру. Это URL, на который пользователь попадет после успешного входа в систему, и по умолчанию "/". Вы также можете настроить вещи так, чтобы пользователь всегда заканчивается на этой странице (независимо от того, был ли вход в систему "по требованию" или они явно решили войти), установив Всегда используйте атрибут default-target для "true"

ИМХО, вы должны оставить все как есть, но убедитесь, что требуемый атрибут sesion установлен после успешного входа в систему, вместо того, чтобы устанавливать этот атрибут на домашней странице. Это обеспечит доступ каждой защищенной страницы к атрибуту сеанса, даже если пользователь не зашел на домашнюю страницу.

Это можно легко сделать с помощью пользовательского подкласса UsernamePasswordAuthenticationFilter, который устанавливает соответствующий атрибут в сеансе после успешной аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...