假设我有 3 个用户登录到我的应用程序,一个管理员用户和 2 个普通用户共享一组权限,这些权限将转换为角色,即他们每个人都有 ROLE_EDIT
, ROLE_ADD
和ROLE_DELETE
,例如。
登录后,管理员用户进入并从其共享权限集中删除角色,假设该权限集来自 ROLE_EDIT, ROLE_ADD, ROLE_DELETE
到只是ROLE_EDIT, ROLE_ADD
。我们现在要删除 ROLE_DELETE
当前登录的两个用户的角色。
我知道SecurityContextHolder
是线程范围的,因此其中仅包含管理员用户的信息。有没有一种简单的方法来访问当前登录的 2 个用户的身份验证信息,以便我可以删除该角色,而无需强制他们注销并重新登录?
最佳答案
SecurityContext
默认情况下将存储在 key SPRING_SECURITY_CONTEXT
下的 HTTP session 中(由 SecurityContextHolderFilter
处理,并进一步委托(delegate)给 HttpSessionSecurityContextRepository
)。这意味着理论上您可以首先获取需要更新其角色的用户的 HttpSession
,然后从中获取他的 SecurityContext
并进行更新。
遗憾的是Servlet没有提供通过session ID获取HTTP session的API,但是你可以引用this idea用于手动跟踪 session 和用户 ID 之间的映射。或者检查 Web 容器是否提供 API 来执行此操作。
关于spring - 如何更新/删除 Spring Security 中所有主体的角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76772034/