2012-04-19 4 views
1

Shiro, похоже, кэширует информацию аутентификации в веб-приложении. Когда я пытаюсь заблокировать пользователя в базе данных во время его сеанса (set locked = true), он продолжает работать, и не выдается код аутентификации (doGetAuthenticationInfo). Блокировка применяется только при выходе пользователя из системы и повторной попытке входа в систему.Shiro немедленная блокировка пользователя

Странно, так как кеширование Сиро должно быть отключено по умолчанию.

Как я могу заблокировать пользователя во время его деятельности, не дожидаясь его выхода в Сиро? Может, мне не хватает какой-то концепции?

ответ

0

Вы только что изменили базу данных? Я предполагаю, что это предполагаемое поведение, которое сиро проводит сеанс и, таким образом, «кэширует» это значение.

Если вы хотите немедленно хотят уничтожить сессию пользователей, сделать

//removes all identifying information and invalidates their session too. 
currentUser.logout(); 
+1

Мне кажется странным, что Широ кэширует информацию аутентификации в сеансе, но не кэширует информацию авторизации. Если я изменю разрешение пользователя, оно будет применено немедленно, но изменения в учетной записи пользователя не будут. –

+0

Я предполагаю, что это связано с тем, как часто все меняется. Разрешения меняются чаще, чем информация об аутентификации. И это также зависит от реализации царства. – rdmueller

+0

btw: есть ли что-то запирающее устройство? Я использую только в качестве плагина grails, и мое царство не поддерживает блокировку пользователей ... – rdmueller

0

Я не нашел отличное решение, но я нашел решение. Хотя этот вопрос, вероятно, слишком старый, чтобы помочь оригинальному плакату, он может помочь другим людям с тем же вопросом.

У меня уже был пользовательский фильтр разрешений, который расширяет FormAuthenticationFilter, и все мои запросы, не связанные с ajax от клиентов, проходят через этот фильтр. Итак, я добавил чек, чтобы узнать, заблокирована ли учетная запись пользователя в isAccessAllowed(...). Если он заблокирован, я регистрирую пользователя и позволяю фильтру продолжать работу. Он отправит их на страницу входа.

У этого есть один основной откат: это, по сути, опрос пользователя базы данных, который контролирует пользователя, чтобы узнать, заблокирована ли учетная запись.

Было бы лучше, если бы процесс блокировки учетной записи привел бы правильный предмет из сеанса пользователя и запустил этот сеанс. Я могу получить сеанс пользователя, но это, похоже, не помогает, поскольку я не могу получить правильный объект темы. Изменение сеанса, похоже, не помогает.

Для чего это стоит, Джаред Бантинг предложил другую хорошую идею, которая, к сожалению, не работала для меня. Его предложение состояло в том, чтобы проверить, когда вы получаете разрешение и роли, и не давайте кому-либо разрешения на заблокированную учетную запись. Это не сработало для меня, потому что я использую только аутентификацию, чтобы позволить пользователю иметь доступ (никаких других разрешений не требуется).

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