【问题标题】:Multiple Apps, Same Session and Updating Roles多个应用程序、相同会话和更新角色
【发布时间】:2017-05-20 02:20:23
【问题描述】:

我们有一个场景,我们有一系列应用程序,所有应用程序都使用 spring-session (w/Redis),用户可以多次登录以访问不同的应用程序。

如果管理员修改用户以添加新角色(例如,访问新应用)(GrantedAuthority),我们需要将其反映在所有用户的活动会话中。

我认为,问题在于 SecurityContextHolder 使用 ThreadLocal 存储来存储 SecurityContext(它又持有 GrantedAuthorities)。

我尝试与会话存储库交互并使用它来更新会话信息,但由于上述 TL 存储,它不会反映在应用程序中。

是否有一种通用的模式/策略以这种方式将更新传播到角色信息?

谢谢。

【问题讨论】:

  • 澄清一下,您的所有应用程序是否通过共享同一个 Redis 会话存储来使用相同的会话信息?或者您正在使用像 OAuth2 这样的集中式身份验证解决方案?
  • 我们使用的是同一个共享 Redis 会话存储。

标签: spring session spring-security roles spring-session


【解决方案1】:

最简单(也是 IMO 首选)的解决方案是强制您的用户重新进行身份验证,从而创建一个新的 Authentication,然后将包含一个新的 GrantedAuthority 集合。您可以使用 Spring Session 的 FindByIndexNameSessionRepository 获取给定用户的所有会话,然后将其删除。这将生成SessionDeletedEvent,它将传播到您的所有应用程序(因为它们共享同一个 Redis 会话存储)。

如果您必须保留活动会话,情况会更加复杂。您仍然可以使用FindByIndexNameSessionRepository 获取给定用户的所有会话,但是您需要从每个会话中提取SecurityContext 并使用新权限更新其Authentication,并确保在共享会话的所有应用程序上完成店铺。为此,您需要在您的ProviderManager 上禁用eraseCredentialsAfterAuthentication,以便您可以使用新权限重新创建Authentication(您需要来自原始Authentication 的凭据)。为了确保SecurityContext 在您的所有应用程序上得到更新,您必须采用某种发布-订阅机制来触发该代码的执行。

如您所见,第一个解决方案更简单、更安全(因为您不需要禁用eraseCredentialsAfterAuthentication)。还值得注意的是,如果 Spring Session 支持HttpSessionAttributeListener(参见this ticket),第二种解决方案会更简单,因为这将涵盖发布-订阅机制部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2021-08-19
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多