2014-03-28 25 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(); 然後,您可以看到哪些領域具有公開清除授權信息的方法,並在這些領域調用它。 –