Как очистить кеш для темы в Широ

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

В 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())

кеш должен обычно очищаться.

Другие вопросы по тегам