【问题标题】:spring security (3.0.x) and user impersonationspring security (3.0.x) 和用户模拟
【发布时间】:2011-09-14 08:01:55
【问题描述】:

在我的 Web 应用程序中,有时经过身份验证的管理员可能想要冒充系统的另一个有效用户,而不必知道该用户的密码。

如何使用 Spring Security 让管理员用户能够模拟系统的普通(非管理员)用户?

Spring Security 文档对此保持沉默,我在任何地方都找不到任何东西。肯定有人解决了这个问题。

谢谢!

【问题讨论】:

  • 前几天我正在阅读文档...他们不是在谈论 RunAs 吗?查看文档,看看是否与您相关

标签: java spring spring-security impersonation


【解决方案1】:

它在 Spring Security 3Spring Security 4 文档中恰当地命名为“Run-As Authentication Replacement”。

AbstractSecurityInterceptor 能够在安全对象回调阶段临时替换 SecurityContext 和 SecurityContextHolder 中的 Authentication 对象。

【讨论】:

    【解决方案2】:

    我相信在 Spring Security 中推荐的方法是使用域访问控制列表,请参阅 GrantedAuthoritySid @

    http://static.springsource.org/spring-security/site/docs/3.1.x/reference/domain-acls.html

    但是,冒充另一个用户不仅仅是拥有“代表身份”,您还应该考虑对日志记录的影响:

    • 您希望您的日志记录显示为原始用户还是模拟用户(或两者兼而有之?)
    • 您希望“模拟”仅显示模拟用户看到的内容,还是原始用户和模拟用户权限的超集?

    另一种可能性是创建“登录身份”功能,这实质上会更改当前会话的主体身份 - 或使用模拟身份启动新会话。

    在上述所有情况下,您可能会无意中引发安全问题 - 所以我认为这就是为什么模拟风格的功能不那么常见的原因。相反,设计趋向于基于角色的访问控制 (RBAC) 或基于属性的访问控制 (ABAC)。使用 RBAC / ABAC,您可以创建一个委托样式功能,您可以在其中创建委托属性/角色 - 在您需要显示委托的源/目标的特殊情况下(例如,对于审计日志),您可以将这些作为极端情况处理.

    【讨论】:

    • 不错的答案。我猜他想做“登录身份”功能。
    • 您还可以注册其他 SpEL 函数,这样您就可以说出类似 hasRole('X') && !isImpersonating() 之类的内容,以防止冒充他人的管理员用户看到敏感数据。
    【解决方案3】:

    如果您希望管理员用户能够模拟其他用户(例如,出于 QA/测试目的),请查看 SwitchUserFilter

    here 提供了您需要的 XML 配置的一个不错的示例

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 2012-08-09
      • 2015-08-12
      • 2011-02-01
      • 1970-01-01
      • 2011-05-10
      • 2013-06-13
      • 2017-07-27
      • 1970-01-01
      相关资源
      最近更新 更多