2014-03-28 104 views
3

Shiro提供了缓存功能,但在我的情况下,我正在为用户使用动态角色和权限。我需要将特定用户的缓存过期(如果有),以便更改权限会立即影响用户。如何清除Shiro中的主题缓存

Realm中有一种方法,但我如何获取关联领域的实例来调用方法来清除缓存。

回答

1

如果您查看AuthorizingRealm中getAuthorizationInfo方法的源代码,您会发现它只是使用键/值存储来缓存授权信息。

它使用PrincipalCollection对象作为关键字。

所以,如果你是这样的:

realm.getAuthorizationCache().remove(SecurityUtils.getSubject().getPrincipals()) 

缓存通常应被清除。

6

我最终公开了AuthorizationRealm扩展领域中的私有方法“clearCachedAuthorizationInfo”。然后传给校长。

public class MyRealm extends AuthorizingRealm { 
    //... 
    @Override 
    public void clearCachedAuthorizationInfo(PrincipalCollection principals) 
    { 
     super.clearCachedAuthorizationInfo(principals); 
    } 
    //... 
} 

清除授权缓存:

realm.clearCachedAuthorizationInfo(SecurityUtils.getSubject().getPrincipals()); 

我觉得这是一个有点清洁剂/安全,因为这种方法对高速缓存对null额外的检查,并确保你得到一个参考缓存如果存在的话。只需拨打getAuthorizationCache()不会这样做,并且可能或不可能一直工作。

您确实需要保持对领域的引用。我通过Spring初始化Shiro,然后在需要它的地方将其注入为Singleton bean。

+0

嘿感谢您的回复。但我不使用弹簧,所以我必须使用INI配置shiro,他们将如何获得shiro使用的领域实例。我试图通过java代码配置shiro,但java代码配置不起作用,它说没有配置领域。 –

+1

要获取所有可用的领域,您可以使用: Collection realms =((RealmSecurityManager)SecurityUtils.getSecurityManager())。getRealms(); 然后,您可以看到哪些领域具有公开清除授权信息的方法,并在这些领域调用它。 –