所谓的身份验证,即在应用中证明用自己的身份。一般比如提供如身份证ID、用户名等来证明是他本人,而用密码来验证。
在《02.Shiro认证与授权原理分析》中我们分析了Shiro验证和授权的基本原理。
其中,在验证的流程中涉及到2个概念:principals和credentials。
在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份:
principals/身份
什么是principal?principals:身份,即主体的标识属性,如用户名、邮箱等,确保唯一即可。
在PrincipalCollection类中的getPrimaryPrincipal()方法中可以看到官方对principal的解释:
Object getPrimaryPrincipal();
1
该方法可获得一个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;
}
1
2
3
4
principal添加到对应的集合中。添加的过程首先判断是否为Collection类型如果是就以添加集合的方式添加,如果不是就添加单个对象。
this.principals = new SimplePrincipalCollection(principal, realmName);
1
credentials/证明
credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等。
最常见的principals和credentials组合就是用户名/密码了。
Shiro相关系列文章
《还在亲手写Filter进行权限校验?尝试一下Shiro吧》
《不解释,全网最全Shiro认证与授权原理分析》