我对 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