Вопрос

Мне нужно связать существующее приложение с безопасностью Acegi/Spring.

Для начала мне нужна одна простая информация:в этом контексте будет ли HttpServletRequest.getUserPrincipal(), вызванный из моего приложения, правильно возвращать имя пользователя, полученное через Spring (в отличие от использования специфичных для Spring объектов)?У меня есть противоречивая информация по этому поводу в Google.

Я предполагаю, что если Acegi реализован с фильтрами, он сможет перегрузить getUserPrincipal() API сервлетов, верно?

Дополнительный вопрос:если по умолчанию это не так, есть ли способ включить это?

Спасибо,

-Эрик

Это было полезно?

Решение

Как ответил предыдущий пользователь, Spring Security поддерживает getUserPrincipal и isUserInRole.Вот как это делает Spring Security.

Когда вы настраиваете Spring, он может загружать следующие фильтры:

http://static.springframework.org/spring-security/site/reference/html/ns-config.html#filter-stack

В составе стандартной конфигурации фильтра SecurityContextHolderAwareRequestFilter фильтр загружен.

Рассматриваем фильтр @ https://fisheye.springsource.org/browse/spring-security/tags/spring-security-parent-2.0.4/core/src/main/java/org/springframework/security/wrapper/SecurityContextHolderAwareRequestFilter.java?r= 2514

Вы можете видеть, что он обертывает и изменяет HttpServletRequest возражать против SecurityContextHolderAwareRequestWrapper класс, который расширяет HttpServletRequestWrapper который реализует HttpServletRequest и передать его обратно в стандартную цепочку doFilter фильтра сервлетов.Начиная с весеннего защитного фильтра должен настроить в качестве первого фильтра, все последующие классы будут видеть SecurityContextHolderAwareRequestWrapper вместо.Сюда входят страницы JSP или сервлеты, стоящие за этим фильтром.

Когда вы звоните на isUserInRole или getUserPrincipal со страницы JSP, сервлета или любой платформы, стоящей за этим фильтром, он вызывает HttpServletRequest реализация из Spring Security.

Другие советы

Если вы используете фильтр безопасности, да, это так.Я считаю, что это поведение по умолчанию.

Какой именно класс вы возвращаете, зависит от вашей конфигурации, но все они реализуют интерфейс Principal посредством собственного интерфейса Spring org.springframework.security.Authentication, который расширяет его.

Я использовал request.getUserPrincipal() и request.isUserInRole() в приложении Spring, и они работают без проблем, даже внутри JSP.

Я верю, что Spring Security хранит эту информацию в SecurityContext, а не в запросе.Вы можете легко написать FilterSecurityInterceptor, который также можно настроить для добавления этой информации в запрос.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top