|
|
|
[SpringMVC] Обновление объекта Authentication
|
|||
|---|---|---|---|
|
#18+
Методы контроллера SpringMVC выглядят примерно так (более-менее стандартный подход): Код: java 1. 2. 3. 4. 5. 6. 7. 8. AuthUser - сущность-объект для авторизации, может быть через Гугл, Фейсбук, логином с паролем и т.д. User - сущность-объект, характеризующий непосредственно самого пользователя. На одного User может ссылаться несколько AuthUser (логин любым способом). Это прелюдия. Проблема в том, что, как я понимаю, authentication в вызываемом методе устанавливается из контекста Спринга примерно таким способом: Код: java 1. Если я меняю какое-то поле в объекте User (или AuthUser), то обновляю контекст, и данные пользователя при рефреше страницы или переходе на другую поменяются. Но! Если у меня открыто 2 браузера и в одном из них я поменяю объект User или AuthUser, то другой на это автоматически не среагирует - ни при рефреше, ни при переходе (контекст для данной сессии не поменялся), сменится только при повторном логоне (вручную или через Remember-Me) - путем переназначения authentication. Особой проблемы в том, чтобы для контроллера определить Код: java 1. и в каждом методе добавить строку Код: java 1. нет - в этом переопределнном методе провайдера userDetailsService заново вычитывает учетные данные из базы. Но: а) уж больно такой "ручной" способ мне кажется некошерным; б) неэстетично добавлять этот код в каждый из методов контроллера. Я, конечно, понимаю, что на практике для достижения решения этот вызов так или иначе необходим, только вот гложат меня сомнения - а нет ли каких-то дополнительных настроек, которые толкали автообновлять нужные данные при запросе? - Не хочется переопределять очередной спринговский класс для выполнения требуемого (чтобы заново тянул данные при запросе). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2012, 23:07:55 |
|
||
|
[SpringMVC] Обновление объекта Authentication
|
|||
|---|---|---|---|
|
#18+
Про настройки не знаю, но что бы каждый раз не писать в принципе можно же обычным фильтром обойтись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2012, 09:47:33 |
|
||
|
[SpringMVC] Обновление объекта Authentication
|
|||
|---|---|---|---|
|
#18+
IDVsbruck, я бы хранил в Authentication не полностью объект AuthUser, а только его ключ (логин+провайдер). А там где нужно - вытаскивал из базы/кеша данные по этому ключу. При изменении других полей в этом объекте сохраняем эти поля в базу/кеш. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2012, 11:22:17 |
|
||
|
[SpringMVC] Обновление объекта Authentication
|
|||
|---|---|---|---|
|
#18+
pavel_nvПро настройки не знаю, но что бы каждый раз не писать в принципе можно же обычным фильтром обойтись? Да, конечно, даже проще интерцептор подключить на входящие запросы. Правда, будет обновлять объект даже если я его не использую в методе. Вот если бы подключить его только для методов с вызовом Authenticate ... Хотя с точки зрения нагрузки проще обновлять в нужных методах. Advaя бы хранил в Authentication не полностью объект AuthUser, а только его ключ (логин+провайдер). А там где нужно - вытаскивал из базы/кеша данные по этому ключу. При изменении других полей в этом объекте сохраняем эти поля в базу/кеш. Так я выигрываю на одном единственном запросе на всю сессию - первом при входе. Это плюс. А минус покрупнее будет - иногда удобно пользовать объектом, даже зная, что какие-то поля могут быть изменены. А взять из памяти как бы проще, чем дергать из базы. Хотя сначала идея мне показалась очень дельной, только эффекта от нее нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2012, 14:30:06 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38037416&tid=2130570]: |
0ms |
get settings: |
20ms |
get forum list: |
24ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
73ms |
get topic data: |
20ms |
get forum data: |
5ms |
get page messages: |
72ms |
get tp. blocked users: |
3ms |
| others: | 345ms |
| total: | 574ms |

| 0 / 0 |
