java - Spring Security 中的 "principal"是什么?

我对 Spring 和 Spring Security 非常陌生。我正在阅读有关 Spring Security 的内容,它提出了 principal 的概念,它应该是当前登录的用户。但是,如果我们有多个当前登录用户怎么办?那么,我的问题是,那么 Spring Security 的主体到底是什么?

例如,我已经阅读了本教程:

http://www.mkyong.com/spring-security/get-current-logged-in-username-in-spring-security/

他们似乎考虑到当前只有一个登录用户,但这种情况并不常见。

如何检索特定用户?以及如何区分正在执行请求的用户?

最佳答案

主体当前登录的用户。但是,您通过绑定(bind)到当前线程的安全上下文来检索它,因此它也绑定(bind)到当前请求及其 session 。

SecurityContextHolder.getContext() 通过一个ThreadLocal 变量在内部获取当前的SecurityContext 实现。因为请求绑定(bind)到单个线程,这将为您提供当前请求的上下文。

为简化起见,您可以说安全上下文在 session 中,并且包含用户/主体和角色/权限。

How do I retrieve a specific user?

你没有。所有 API 都旨在允许访问当前请求的用户和 session 。让用户 A 成为 100 个当前经过身份验证的用户之一。如果 A 向您的服务器发出请求,它将分配一个线程来处理该请求。如果您随后执行 SecurityContextHolder.getContext().getAuthentication() 您将在此线程的上下文中执行此操作。默认情况下,您无法从该线程中访问由不同线程处理的用户 B 的上下文。

And how do I differentiate between users that are doing requests?

您不必这样做,这就是 Servlet 容器为您做的事情。

关于java - Spring Security 中的 "principal"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37499307/

相关文章:

spring - 是否可以在表单 :select/form:option 的 itemLabel 中

java - 通过 Spring 将字段注入(inject) Hibernate 加载的实体中

performance - ORM 解决方案(JPA;Hibernate)与 JDBC

java - Spring Redis - 从 application.properties 文件中

java - 使用 Spring 将文本文件直接注入(inject) String

java - servlet 映射 url 模式上的双通配符 (*) 是什么意思?

spring - Thymeleaf - 使用 PUBLICID "null"请求的不受支持的实体

mysql - spring jpa application.properties useSSL

java - SpringBoot - BeanDefinitionOverrideExceptio

java - Spring Boot 是否可以使用 JAR 包装来提供 JSP?