Shiro身份认证之principals和credentials

所谓的身份验证,即在应用中证明用自己的身份。一般比如提供如身份证ID、用户名等来证明是他本人,而用密码来验证。

在《02.Shiro认证与授权原理分析》中我们分析了Shiro验证和授权的基本原理。

其中,在验证的流程中涉及到2个概念:principals和credentials。

在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份:

principals/身份

什么是principal?principals:身份,即主体的标识属性,如用户名、邮箱等,确保唯一即可。

在PrincipalCollection类中的getPrimaryPrincipal()方法中可以看到官方对principal的解释:

Object getPrimaryPrincipal();

该方法可获得一个principal的对象,通过返回类型为Object可以看出,principal可以为任意对象。

再看看该类上对返回结果的描述:

Returns the primary principal used application-wide to uniquely identify the owning account/Subject.

The value is usually always a uniquely identifying attribute specific to the data source that retrieved the account data. Some examples:
a UUID
a long value such as a surrogate primary key in a relational database
an LDAP UUID or static DN
a String username unique across all user accounts

通过官方注释可以看出principal通常有以下类型:

  • 1)可以是uuid
  • 2)数据库中的主键
  • 3)LDAP UUID或静态DN
  • 4)在所有用户帐户中唯一的字符串用户名。

也就是说这个值必须是唯一的。也可以是邮箱、身份证等值。

一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号。

上面是通过PrincipalCollection类提供的方法进行获取principals,通常在使用之前通过构造方法将其传入:

public SimpleAuthenticationInfo(Object principal, Object credentials, String realmName) {
    this.principals = new SimplePrincipalCollection(principal, realmName);
    this.credentials = credentials;
}

principal添加到对应的集合中。添加的过程首先判断是否为Collection类型如果是就以添加集合的方式添加,如果不是就添加单个对象。

this.principals = new SimplePrincipalCollection(principal, realmName);

credentials/证明

credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等。

最常见的principals和credentials组合就是用户名/密码了。



Shiro身份认证之principals和credentials插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://choupangxia.com/2021/01/26/shiro-principals-credentials/