Как очистить кеш для темы в Широ
Широ предоставляет функцию кэширования, но в моем случае я использую динамические роли и разрешения для пользователей. Мне нужно истечь кеш для конкретного пользователя, если таковые имеются, чтобы изменения в разрешениях немедленно влияли на пользователя.
В Realm есть метод, но как получить экземпляр ассоциированной области для вызова метода для очистки кэша.
2 ответа
Я закончил тем, что выставил закрытый метод "clearCachedAuthorizationInfo" в расширенной области AuthorizingRealm. Тогда просто переходите в принципы.
public class MyRealm extends AuthorizingRealm {
//...
@Override
public void clearCachedAuthorizationInfo(PrincipalCollection principals)
{
super.clearCachedAuthorizationInfo(principals);
}
//...
}
очистить кеш авторизации:
realm.clearCachedAuthorizationInfo( SecurityUtils.getSubject().getPrincipals() );
Я думаю, что это немного чище / безопаснее, потому что этот метод имеет дополнительные проверки против null
на кеш и будет гарантировать, что вы получите ссылку на кеш, если таковой существует. Просто звоню getAuthorizationCache()
не делает этого и может или не может работать все время.
Вам нужно поддерживать ссылку на царство. Я сделал это, инициализировав Широ через Spring, а затем внедрив его как бин Singleton, где бы он мне ни понадобился.
Если вы проверите источник метода getAuthorizationInfo в AuthorizingRealm, вы увидите, что он просто использует хранилище ключей / значений для кэширования информации авторизации.
Он использует объект PrincipalCollection в качестве ключа.
Так что если вы называете что-то вроде:
realm.getAuthorizationCache().remove(SecurityUtils.getSubject().getPrincipals())
кеш должен обычно очищаться.