2015-09-03 128 views
2

我有一個戰爭項目,在Wildfly上部署了JAX-RS接口,並且配置了一個安全域,它從數據庫加載用戶密碼和角色。安全域使用cache-type = default。安全域無法識別已認證用戶的更新,因爲舊數據已被緩存。我用jboss-cli.sh驗證了這一點。那麼如何從緩存中刪除特定的用戶呢?我想在部署的應用程序中執行此操作,而不是通過jboss-cli.sh。安全域蜻蜓沖刷緩存

+0

您正在使用哪個版本的WildFly? –

+0

它是蜻蜓8.2.0.final – Helmosch

回答

4

您的問題可能與WildFly中的一個錯誤有關:https://issues.jboss.org/browse/WFLY-3221

有一種變通方法,以明確刷新驗證緩存:

@WebListener 
public class SessionInvalidationListener implements HttpSessionListener { 

    @Inject 
    private Principal principal; 

    @Resource(name = "java:jboss/jaas/mydomain/authenticationMgr") 
    private CacheableManager<?, Principal> authenticationManager; 

    @Override 
    public void sessionCreated(HttpSessionEvent se) { 
     // not used 
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent se) { 
     authenticationManager.flushCache(principal); 
    } 
} 

我在一個稍微不同的用例測試這種方法。有趣的是訪問authenticationManager - 應該很容易適應你的情況。

這個bug應該在WildFly 9.x中修復(我沒有檢查)。

+0

我不使用會話,所以這個錯誤不會影響我的問題。我只是想沖洗我的安全域的緩存,這完全是你的解決方案:)坦克!我有一個新的問題,因此打開一個新的線程。 – Helmosch

+0

有關如何在Wildfly的多個實例之間刷新緩存的想法?要麼以獨立模式或域模式運行? – SamF

0

在Wildfly 10使用域模式下,你可以通過使用JBoss-CLI以下方式很容易清除安全域緩存:

首先連接到域控制器通過使用

./jboss-cli.sh --connect controller={domainhost}:9990 --user={username} --password={password} 

然後執行命令

/host={hostname}/server={instancename}/subsystem=security/security-domain={securityname}:flush-cache 

如果安全域的定義是這樣的:

<security-domain name="ldap-test" cache-type="default"> 

命令看起來就像這樣:

/host=wf-server-1/server=instance-1/subsystem=security/security-domain=ldap-test:flush-cache 

類似的解決方案應進行單機模式下工作。