2015-09-03 131 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 

类似的解决方案应进行单机模式下工作。