spring security(3.0.x)和用户模仿

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

如何使用Spring Security为管理员用户提供模拟系统正常(非管理员)用户的能力?

Spring Security文档对此保持沉默,我无法在任何地方找到任何内容。 当然有人必须解决这个问题。

谢谢!

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

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

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

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

但是,模仿另一个用户不仅仅是拥有“委托身份”,您还应该考虑对日志记录的影响:

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

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

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

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

这里提供了您需要的XML配置的一个很好的例子