Нечетное изменение типа объекта в Spring Security - PullRequest
0 голосов
/ 27 января 2011

Может кто-нибудь сказать мне, почему это

Details user=(Details) SecurityContextHolder.getContext().getAuthentication().getDetails();

иногда возвращает Object, а иногда String?

Я проверил, если пользователь вошел в систему с

System.out.println(SecurityContextHolder.getContext().getAuthentication().isAuthenticated());

Это печатает правда.

Ответы [ 5 ]

2 голосов
/ 28 января 2011

Существующие методологии аутентификации включают три основных «фактора»:

  • Что-то, что пользователь знает (например, пароль, пин-код); [Authentication.getCredentials ()]

  • Что-то, что есть у пользователя (например, ID, банкомат карта, смарт-карта); [Authentication.getPrincipal ()] и

  • Что-то, чем является пользователь (например, биометрическая характеристика, такая как отпечатков пальцев). [Authentication.getDetails ()]

Совершенно логично, что дизайнеры выбрали все три (Credentials, Principal и Details) как Object в Authentication интерфейсе.

В весенней безопасности AuthenticationProvider может задавать детали при успешной аутентификации. Значение по умолчанию AbstractUserDetailsAuthenticationProvider копирует данные, полученные в запросе аутентификации, в успешную аутентификацию. Предполагая, что ни один из провайдеров аутентификации не вводит String в деталях, мы должны проверить Filters, чтобы увидеть, устанавливается ли какая-либо строка в деталях запроса аутентификации.

2 голосов
/ 27 января 2011

Объект, полученный в getDetails(), действительно является местом для дополнительной информации об имевшей место аутентификации, поэтому это Object, которая может содержать что угодно.Хотя некоторые, такие как Стивен С., могут ненавидеть это, я думаю, что это блестяще, потому что это позволяет вам хранить информацию о , как пользователь вошел в систему, а также обычном , который вошел в систему. Например, мы используемчтобы записать, на каком из наших поддоменов вошел пользователь, что является важной информацией для нашего приложения.

Я думаю, что getDetails() обычно возвращает объект WebAuthenticationDetails, если пользователь вошел в систему с помощью веб-формы.,Я не могу точно вспомнить, что заставляет его возвращать строку, но я подозреваю, что это для анонимных пользователей.

Это может показаться странным, но нет необходимости смотреть на getDetails() при базовом использовании SpringБезопасность.getDetails() не сообщает вам никакой информации о том, кто вошел в систему или что им разрешено делать, так что вы можете спокойно игнорировать ее - если ваше приложение (как и мое) не должно знать как , а также кто вошел в систему.

1 голос
/ 27 января 2011

Метод Authentication.getDetails() - мерзость.Интерфейс Authentication говорит, что он возвращает Object, а различные реализации возвращают объекты с очень разными деталями.

Зачем они это сделали?

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

Конечный результат заключается в том, что если на вашем сайте используется несколько механизмов аутентификации / авторизации, извлечение и использование сведений о пользователе является настоящей болью ввстык.

0 голосов
/ 27 января 2011

Строка обычно возвращается, когда вы предоставляете доступ к ресурсу анонимному пользователю.Ваша конфигурация должна выглядеть примерно так:

<security:intercept-url pattern="/login*" access="ROLE_ANONYMOUS" />

Проверьте здесь подробнее об анонимной аутентификации здесь, http://static.springsource.org/spring-security/site/docs/3.0.x/reference/anonymous.html

Если вы используете автоматическую настройку и не настраиваете атрибуты анонимного пользователя, org.springframework.security.config.http.AuthenticationConfigBuilder позаботится об этом.В этом случае анонимное имя пользователя будет «anonymousUser», а «ROLE_ANONYMOUS» будут предоставлены полномочия.

0 голосов
/ 27 января 2011

Как говорит @gutch, из javadoc getDetails()

Хранит дополнительную информацию о запросе аутентификации. Это могут быть IP-адрес, серийный номер сертификата и т. Д.

Что касается getPrincipal()

В случае запроса аутентификации с именем пользователя и паролем это будет имя пользователя.

Реализация AuthenticationManager часто возвращает Authentication, содержащий более богатая информация в качестве принципала для использования приложением. Многие провайдеры аутентификации будут создавать объект UserDetails в качестве принципала.

То, что возвращается, зависит от того, кто его возвращает!

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