当前位置: 首页 > 知识库问答 >
问题:

Spring安全的“原则”是什么?

陆飞捷
2023-03-14

我对Spring和Spring Security都是新手。我在读关于Spring Security的文章,它提出了principal的概念,应该是当前登录的用户。但如果我们有多个当前登录用户呢?那么,我的问题是,在Spring安全中,校长到底是什么?

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

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

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

如何检索特定用户?我如何区分正在处理请求的用户?

共有3个答案

苏振国
2023-03-14

校长只是JavaSE 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,那么PrincipalgetName()返回UserDetails用户名。

如果我们看到Spring用于AbstractAuthenticationToken的实现。类

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();
        }
    }

还有一点很重要:

抽象类AbstractAuthenticationToken实现身份验证

接口身份验证扩展了主体

Principal接口还确保实现者将实现equals()hashCode(),这很有意义,因为代表组织、公司或个人的主体实体必须有某种方式与其他实体进行比较。

董砚
2023-03-14

委托人的简要定义

主体代表用户的身份。

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

薛焱
2023-03-14

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

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

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

如何检索特定用户?

你没有。所有的API都是为允许用户访问而设计的

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

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

 类似资料:
  • 我在玩谷歌YouTube API Java客户端库。我已经编写了一个Spring Boot服务,您可以使用Spring Security OAuth使用您的Google帐户登录。这一切都很好。 现在,在RESTendpoint方法中,我有类似的东西 其中实例是的实例。 理想情况下,我希望我的服务使用登录用户的凭据进行YouTube API调用,但我无法弄清楚如何从给定的实例构建实例。 我知道我可以

  • 本文向大家介绍区块链中有助于消除安全威胁的关键原则是什么?相关面试题,主要包含被问及区块链中有助于消除安全威胁的关键原则是什么?时的应答技巧和注意事项,需要的朋友参考一下 回答:**以下是区块链中有助于消除安全威胁的关键原则: 连续性计划 稽核 确保测试和类似方法 数据库安全 保护应用程序 数字化劳动力培训

  • 本文向大家介绍什么是安全策略?相关面试题,主要包含被问及什么是安全策略?时的应答技巧和注意事项,需要的朋友参考一下 回答:安全策略是一个正式且简短的计划,其中包含组织的目标,目的和信息安全程序。简而言之,它定义了确切地需要保护免受威胁的条件以及在威胁发生时如何处理情况。

  • 本文向大家介绍什么是最左前缀原则?相关面试题,主要包含被问及什么是最左前缀原则?时的应答技巧和注意事项,需要的朋友参考一下 MySQL中的索引可以以一定顺序引用多列,这种索引叫作联合索引。如User表的name和city加联合索引就是(name,city),而最左前缀原则指的是,如果查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到。如下: 这里需要注意的是,查询的时候如果两个

  • 问题内容: DataflowAnomalyAnalysis:找到变量“ variable”(行“ n1”-“ n2”)的“ DD”异常。 DataflowAnomalyAnalysis:找到变量“ variable”(行“ n1”-“ n2”)的“ DU”异常。 DD和DU听起来很熟悉…我想在涉及最差的前后条件的测试和分析中说些什么,但我不记得具体情况。 NullAssignment:将Objec

  • 我们正在尝试使用以下查询将数据流式传输到postgres 11: 基本上“在表中插入记录,如果它已经存在 - 我们希望将此查询连接到消息队列,并在多个实例中的高并发环境中运行它。使用此查询,可能会从不同的连接访问同一行。对我们来说,只有具有最高交付时间戳的项目最终才能进入表是至关重要的 根据文件: 在冲突时,DO UPDATE保证原子插入或更新结果;如果没有独立的错误,那么即使在高并发的情况下,这