我真的是 Spring 和 Spring Security 的新手。我正在阅读有关 Spring Security 的文章,它提出了 principal 的概念,它应该是当前登录的用户。但是,如果我们有多个当前登录用户怎么办?所以,我的问题是,spring security 的主体到底是什么?
例如,我读过本教程:
http://www.mkyong.com/spring-security/get-current-logged-in-username-in-spring-security/
而且他们似乎考虑到当前只有一个登录用户,但这种情况并不常见。
如何检索特定用户?我如何区分发出请求的用户?
原文由 nbro 发布,翻译遵循 CC BY-SA 4.0 许可协议
主体 是 当前登录的用户。但是,您通过绑定到当前线程的安全上下文检索它,因此它也绑定到当前请求及其会话。
SecurityContextHolder.getContext()
内部获取当前SecurityContext
实现通过ThreadLocal
变量。因为请求绑定到单个线程,所以这将为您提供当前请求的上下文。为简化起见,您可以说安全上下文在会话中并且包含用户/主体和角色/权限。
你不知道。所有 API 都旨在允许访问当前请求的用户和会话。让用户 A 成为 100 个当前经过身份验证的用户之一。如果 A 向您的服务器发出请求,它将分配一个线程来处理该请求。如果您随后执行
SecurityContextHolder.getContext().getAuthentication()
您将在此线程的上下文中执行此操作。默认情况下,您无法从该线程中访问由不同线程处理的用户 B 的上下文。您不必这样做,这就是 Servlet 容器为您所做的。