安全域的 Wildfly 刷新缓存

Posted

技术标签:

【中文标题】安全域的 Wildfly 刷新缓存【英文标题】:Wildfly flush cache of security-domain 【发布时间】:2015-11-29 21:21:45 【问题描述】:

我在wildfly上部署了一个带有JAX-RS接口的war项目,并且配置了一个安全域,它从db加载用户密码和角色。安全域使用 cache-type=default。安全域无法识别经过身份验证的用户的更新,因为旧数据已被缓存。我用 jboss-cli.sh 验证了这一点。那么如何从缓存中删除特定用户呢?我想在已部署的应用程序中执行此操作,而不是通过 jboss-cli.sh。

【问题讨论】:

您使用的是哪个版本的 WildFly? 这是wildfly 8.2.0.final 【参考方案1】:

您的问题可能与 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 - 它应该很容易适应您的情况。

该错误应该在 WildFly 9.x 中修复(我没有检查)。

【讨论】:

我不使用会话,所以这个错误不会影响我的问题。我只想刷新我的安全域的缓存,而这完全是您的解决方案所做的 :) 坦克!我遇到了一个新问题,因此打开了一个新线程。 知道如何跨多个 Wildfly 实例刷新缓存吗?在独立模式或域模式下运行? 这是我在 Wildfly11 上遇到的缓存问题的最准确答案【参考方案2】:

在使用域模式的 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

类似的解决方案应该适用于独立模式。

【讨论】:

在独立的命令看起来像这样jboss-cli.sh -c --controller=127.0.0.1:9990 --user=username --password=password --command="/subsystem=security/security-domain=ldap-test:flush-cache"【参考方案3】:

如果您从安全域中删除属性“cache-type=default”,则不会使用缓存。 也可以在这里查看:https://docs.jboss.org/author/display/WFLY8/Security+subsystem+configuration

【讨论】:

以上是关于安全域的 Wildfly 刷新缓存的主要内容,如果未能解决你的问题,请参考以下文章

jboss-6.0.0.Final 与 wildfly-10.1.0.Final 中的每个用户数据源连接池(通过安全域)

Windows安全基础-AD域

在安全方面,允许特定域的 CORS 是不是有意义?

使用 jboss 安全域的 LDAP 身份验证

ios11安全域的兼容问题

如何绕过特定域的经过身份验证的端点上的弹簧安全性?