我对Spring和Spring安全真的很陌生。我读过关于Security的文章,它提出了主体的概念,它应该是当前登录的用户。但是,如果我们有多个当前已登录的用户呢?那么,我的问题是,那么春季安全的原则到底是什么呢?
例如,我读过本教程:
http://www.mkyong.com/spring-security/get-current-logged-in-username-in-spring-security/
他们似乎考虑到只有一个当前登录的用户,这种情况通常不是这样的。
如何检索特定用户?以及如何区分正在执行请求的用户?
发布于 2016-05-28 13:03:09
主体是当前登录的用户。但是,您可以通过绑定到当前线程的安全上下文检索它,因此它也绑定到当前请求及其会话。
SecurityContextHolder.getContext()内部通过一个ThreadLocal变量获得当前的SecurityContext实现。因为请求绑定到单个线程,这将为您提供当前请求的上下文。
为了简化,您可以说安全上下文在会话中,包含用户/主体和角色/权限。
如何检索特定用户?
没有,所有的API都被设计为允许访问当前请求的用户和会话。让用户A成为当前通过身份验证的100个用户之一。如果A向您的服务器发出请求,它将分配一个线程来处理该请求。如果然后执行SecurityContextHolder.getContext().getAuthentication(),则在这个线程的上下文中这样做。默认情况下,在该线程中,您无法访问由不同线程处理的用户B的上下文。
以及如何区分正在执行请求的用户?
您不必这样做,这就是Servlet容器为您所做的。
发布于 2020-11-30 07:18:12
--主体的简单定义:
主体表示用户的身份。
它可以是一个具有简单级别用户名的字符串对象,也可以是一个复杂的UserDetails对象。
发布于 2021-09-05 20:24:10
主体只是来自Java 6的一个旧接口。
作为所有没有默认实现的接口,简单定义了一些方法,这些方法需要由实现该接口的类实现。
这些方法是
boolean equals(Object another)
Compares this principal to the specified object.
String getName()
Returns the name of this principal.
int hashCode()
Returns a hashcode for this principal.
String toString()
Returns a string representation of this principal.正如Java所说:
这个接口表示主体的抽象概念,它可以用来表示任何实体,例如个人、公司和登录id。
简单地说,它只是用于使实现者必须实现这个接口,从而使一个实体在其他实体之间有独特的区别。此外,getName()还必须返回一个值,通过该值可以唯一地标识一个特定实体,并且不会与其他实体发生冲突。因此,如果使用的Principal是UserDetails类型的,那么getName() of Principal将返回UserDetails的UserName。
如果我们看到Spring为AbstractAuthenticationToken.class使用的实现:
public String getName() {
if (this.getPrincipal() instanceof UserDetails) {
return ((UserDetails)this.getPrincipal()).getUsername();
} else if (this.getPrincipal() instanceof AuthenticatedPrincipal) {
return ((AuthenticatedPrincipal)this.getPrincipal()).getName();
} else if (this.getPrincipal() instanceof Principal) {
return ((Principal)this.getPrincipal()).getName();
} else {
return this.getPrincipal() == null ? "" : this.getPrincipal().toString();
}
}还必须指出:
abstract class AbstractAuthenticationToken implements Authentication和
interface Authentication extends Principal
Principal接口还确保了实现者将实现equals()和hashCode(),这是很有意义的,因为代表组织或公司或个人的主体的实体必须有某种方式与其他实体进行比较。
https://stackoverflow.com/questions/37499307
复制相似问题