Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / [SpringMVC] Обновление объекта Authentication / 4 сообщений из 4, страница 1 из 1
13.11.2012, 23:07:55
    #38037156
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SpringMVC] Обновление объекта Authentication
Методы контроллера SpringMVC выглядят примерно так (более-менее стандартный подход):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@RequestMapping(value = "/somemethod", method = RequestMethod.GET)
@PreAuthorize("hasRole('USER')")
public ModelAndView someMethod(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws Exception {
	User user = ((AuthUser) authentication.getPrincipal()).getUser();
	ModelAndView view = new ModelAndView("some_path");
	...
	return view;
}


AuthUser - сущность-объект для авторизации, может быть через Гугл, Фейсбук, логином с паролем и т.д. User - сущность-объект, характеризующий непосредственно самого пользователя. На одного User может ссылаться несколько AuthUser (логин любым способом).

Это прелюдия. Проблема в том, что, как я понимаю, authentication в вызываемом методе устанавливается из контекста Спринга примерно таким способом:
Код: java
1.
SecurityContextHolder.getContext().getAuthentication()

Если я меняю какое-то поле в объекте User (или AuthUser), то обновляю контекст, и данные пользователя при рефреше страницы или переходе на другую поменяются. Но! Если у меня открыто 2 браузера и в одном из них я поменяю объект User или AuthUser, то другой на это автоматически не среагирует - ни при рефреше, ни при переходе (контекст для данной сессии не поменялся), сменится только при повторном логоне (вручную или через Remember-Me) - путем переназначения authentication.

Особой проблемы в том, чтобы для контроллера определить
Код: java
1.
@Resource private MyAuthenticationProvider authenticationProvider;

и в каждом методе добавить строку
Код: java
1.
authentication = authenticationProvider.authenticate(authentication);

нет - в этом переопределнном методе провайдера userDetailsService заново вычитывает учетные данные из базы.

Но:
а) уж больно такой "ручной" способ мне кажется некошерным;
б) неэстетично добавлять этот код в каждый из методов контроллера.
Я, конечно, понимаю, что на практике для достижения решения этот вызов так или иначе необходим, только вот гложат меня сомнения - а нет ли каких-то дополнительных настроек, которые толкали автообновлять нужные данные при запросе? - Не хочется переопределять очередной спринговский класс для выполнения требуемого (чтобы заново тянул данные при запросе).
...
Рейтинг: 0 / 0
14.11.2012, 09:47:33
    #38037416
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SpringMVC] Обновление объекта Authentication
Про настройки не знаю, но что бы каждый раз не писать в принципе можно же обычным фильтром обойтись?
...
Рейтинг: 0 / 0
14.11.2012, 11:22:17
    #38037562
Adva
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SpringMVC] Обновление объекта Authentication
IDVsbruck,

я бы хранил в Authentication не полностью объект AuthUser, а только его ключ (логин+провайдер). А там где нужно - вытаскивал из базы/кеша данные по этому ключу. При изменении других полей в этом объекте сохраняем эти поля в базу/кеш.
...
Рейтинг: 0 / 0
14.11.2012, 14:30:06
    #38038040
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SpringMVC] Обновление объекта Authentication
pavel_nvПро настройки не знаю, но что бы каждый раз не писать в принципе можно же обычным фильтром обойтись? Да, конечно, даже проще интерцептор подключить на входящие запросы. Правда, будет обновлять объект даже если я его не использую в методе. Вот если бы подключить его только для методов с вызовом Authenticate ... Хотя с точки зрения нагрузки проще обновлять в нужных методах.
Advaя бы хранил в Authentication не полностью объект AuthUser, а только его ключ (логин+провайдер). А там где нужно - вытаскивал из базы/кеша данные по этому ключу. При изменении других полей в этом объекте сохраняем эти поля в базу/кеш.
Так я выигрываю на одном единственном запросе на всю сессию - первом при входе. Это плюс. А минус покрупнее будет - иногда удобно пользовать объектом, даже зная, что какие-то поля могут быть изменены. А взять из памяти как бы проще, чем дергать из базы. Хотя сначала идея мне показалась очень дельной, только эффекта от нее нет.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / [SpringMVC] Обновление объекта Authentication / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]