Spring Security предполагает, что аутентификация является Принципалом.Весенняя безопасность: почему аутентификация распространяется на Принципала?
public interface Authentication extends Principal, Serializable {}
HttpServletRequest имеет метод getUserPrincipal, который отвечает за доступ к основному объекту.
Давайте рассмотрим этот случай:
public interface RealPrincipal extends Principal {
public Integer getId();
}
Общего модуль А имеет вещественный главный интерфейс и реализацию.
Модуль A использует общий модуль A, Servlet Апи и не зависит от Spring Security:
Модуль B использует общий модуль A, Servlet Апи и настраивает Spring Security. Этот модуль отвечает за безопасность и реализацию UserDetails.
Web А использует модуль A и B. Модуль
Для того чтобы использовать методы запроса, я в конечном итоге с такой реализации:
public ModelAndView someRequestHandler(Principal principal) {
User activeUser = (User) ((Authentication) principal).getPrincipal();
...
}
Это вынуждает меня есть зависимость Spring Security для модуля А и других модулей. Я считаю, что правильная абстракция сервлета не должна зависеть от весенней безопасности. request.getUserPrincipal должен возвращать реальный главный.
Пожалуйста, объясните, почему org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper возвращает
аутентификации вместо Real Principal
.
Редактировать: я добавил общий модуль A к моему сценарию и обновил, что модуль B отвечает за безопасность.
Спасибо, Роб за отличные ответы. Теперь я понял, что Spring Security связана не только с веб-приложением, но и с автономными приложениями. Это означает, что Пользователь не должен быть Принципалом. И для того, чтобы соответствовать Http Api, аутентификация реализовала интерфейс Principal. Пока что так хорошо :) Вот мой вопрос: что, если пользователь Spring Security пользователь уже реализует интерфейс Principal? Это приводит к такой реализации, которая идеально подходит, я думаю: https://gist.github.com/cemo/6041868 что вы думаете? – Cemo
Предлагаемое вами изменение будет не пассивным, поэтому в лучшем случае оно может быть включено в релиз 4.x. Я не думаю, что это прецедент, который нужен большинству, поэтому я не думаю, что он будет включен в 4.x. Это не означает, что у вас нет веских оснований для того, чтобы делать то, что вы делаете, но в качестве рамки нам нужно попытаться нацелиться на 90% -ные сокращения и иметь крючки для других случаев. –