2013-08-15 3 views
7

В моем приложении MVC весной я хочу получить доступ к объекту , созданному весной безопасности в моем сервисе. Я думал о том, чтобы вводить его в классы обслуживания, но я уверен, что он не будет потокобезопасным. Другой вариант Я думаю, это передать его всем методам обслуживания в качестве аргумента, но это не выглядит очень чистым для меня. Что было бы лучшим способом сделать это?Получить главный пользовательский объект в методах обслуживания

ответ

10

Я думаю, что наилучшим подходом было бы использовать SecurityContextHolder.

Principal principal = SecurityContextHolder.getContext().getAuthentication(); 

Spring объясняет, как это работает в documentation:

Наиболее фундаментальный объект SecurityContextHolder. Здесь хранит данные настоящего контекста безопасности приложения, , который содержит сведения об основном пользователе, использующем в настоящее время приложение . По умолчанию SecurityContextHolder использует ThreadLocal для хранения этих данных, что означает, что контекст безопасности равен , всегда доступным для методов в том же потоке выполнения, даже если контекст безопасности явно не передается в качестве аргумента этих методов , Использование ThreadLocal таким образом вполне безопасно, если убрать , чтобы очистить поток после запроса . Конечно, Spring Security позаботится об этом для вас автоматически, поэтому нет необходимости беспокоиться об этом.

Поскольку для хранения текущей проверки подлинности используется ThreadLocal, у вас не будет проблемы с потоковой безопасностью.

Смежные вопросы