首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >春季保安的“校长”是什么?

春季保安的“校长”是什么?
EN

Stack Overflow用户
提问于 2016-05-28 12:59:46
回答 3查看 74.9K关注 0票数 77

我对Spring和Spring安全真的很陌生。我读过关于Security的文章,它提出了主体的概念,它应该是当前登录的用户。但是,如果我们有多个当前已登录的用户呢?那么,我的问题是,那么春季安全的原则到底是什么呢?

例如,我读过本教程:

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

他们似乎考虑到只有一个当前登录的用户,这种情况通常不是这样的。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-28 13:03:09

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

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

为了简化,您可以说安全上下文在会话中,包含用户/主体和角色/权限。

如何检索特定用户?

没有,所有的API都被设计为允许访问当前请求的用户和会话。让用户A成为当前通过身份验证的100个用户之一。如果A向您的服务器发出请求,它将分配一个线程来处理该请求。如果然后执行SecurityContextHolder.getContext().getAuthentication(),则在这个线程的上下文中这样做。默认情况下,在该线程中,您无法访问由不同线程处理的用户B的上下文。

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

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

票数 121
EN

Stack Overflow用户

发布于 2020-11-30 07:18:12

--主体的简单定义:

主体表示用户的身份。

它可以是一个具有简单级别用户名的字符串对象,也可以是一个复杂的UserDetails对象。

票数 4
EN

Stack Overflow用户

发布于 2021-09-05 20:24:10

主体只是来自Java 6的一个旧接口。

作为所有没有默认实现的接口,简单定义了一些方法,这些方法需要由实现该接口的类实现。

这些方法是

代码语言:javascript
复制
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()还必须返回一个值,通过该值可以唯一地标识一个特定实体,并且不会与其他实体发生冲突。因此,如果使用的PrincipalUserDetails类型的,那么getName() of Principal将返回UserDetailsUserName

如果我们看到Spring为AbstractAuthenticationToken.class使用的实现:

代码语言:javascript
复制
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(),这是很有意义的,因为代表组织或公司或个人的主体的实体必须有某种方式与其他实体进行比较。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37499307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档