Shiro 中的 AuthenticationToken
AuthenticationToken 用于收集用户提交的身份(如用户名)及凭据(如密码)。Shiro会调用CredentialsMatcher
对象的doCredentialsMatch
方法对AuthenticationInfo
对象和AuthenticationToken
进行匹配。匹配成功则表示主体(Subject)认证成功,否则表示认证失败。
public interface AuthenticationToken extends Serializable { Object getPrincipal(); //身份 Object getCredentials(); //凭据 } public interface HostAuthenticationToken extends AuthenticationToken { String getHost();// 获取用户“主机” } public interface RememberMeAuthenticationToken extends AuthenticationToken { boolean isRememberMe();// 记住我 }Shiro 仅提供了一个可以直接使用的
UsernamePasswordToken
,用于实现基于用户名/密码主体(Subject)身份认证。UsernamePasswordToken
实现了 RememberMeAuthenticationToken
和 HostAuthenticationToken
,可以实现“记住我”及“主机验证”的支持。
Shiro 中的 AuthenticationInfo
AuthenticationInfo
对象中存储的是主体(Subject)的身份认证信息。Shiro会调用CredentialsMatcher
对象的doCredentialsMatch
方法对AuthenticationInfo
对象和AuthenticationToken
进行匹配。匹配成功则表示主体(Subject)认证成功,否则表示认证失败。
AuthenticationInfo的继承结构——摘自《跟我学Shiro》
public interface AuthenticationInfo extends Serializable { // 获取用户身份信息 //每个Realm反回一个AuthenticationInfo , //所有AuthenticationInfo 中的PrincipalCollection 会根据指定规则进行合并 PrincipalCollection getPrincipals(); // 获取用户的 凭证信息(credentials),当有多个Realm返回多个AuthenticationInfo 时凭证信息 也会根据指定的规则进行合并 // Shiro会使用 凭证信息(credentials) 验证用户身份的合法性。 Object getCredentials(); } public interface MergableAuthenticationInfo extends AuthenticationInfo { // 用于合并多个Realm返回的AuthenticationInfo void merge(AuthenticationInfo info); } public interface Account extends AuthenticationInfo, AuthorizationInfo { } public interface SaltedAuthenticationInfo extends AuthenticationInfo { ByteSource getCredentialsSalt();// 获取凭证 信息的 盐 }
-
MergableAuthenticationInfo 用于提供在多 Realm 时合并 AuthenticationInfo 的功能,主要合并 Principal、如果是其他的如 credentialsSalt,会用后边的信息覆盖前边的。
-
SaltedAuthenticationInfo 用于对 凭证 信息加盐。比如 HashedCredentialsMatcher,在验证时会判断AuthenticationInfo 是否是SaltedAuthenticationInfo 子类,来获取盐信息。
-
Account
不仅继承了AuthenticationInfo
,继承了AuthorizationInfo
,也就是说它不仅包含主体的身份认证信息,还包含了主体的授权信息(角色、权限)。SimpleAccount 是Account
的一个实现。在IniRealm
、PropertiesRealm
这种静态创建帐号信息的场景中使用,这些Realm
直接继承了SimpleAccountRealm
,而SimpleAccountRealm
提供了相关的 API 来动态维护SimpleAccount
;即可以通过这些 API来动态增删改查SimpleAccount
;动态增删改查角色/权限信息。如果您的帐号不是特别多,可以使用这种方式。 -
其他情况一般返回 SimpleAuthenticationInfo 即可。
Shiro 中的 PrincipalCollection
因为我们可以在 Shiro 中同时配置多个 Realm,所以呢身份信息可能就有多个;因此其提供了 PrincipalCollection 用于聚合这些身份信息。
public interface PrincipalCollection extends Iterable, Serializable { Object getPrimaryPrincipal(); //得到主要的身份 <T> T oneByType(Class<T> type); //根据身份类型获取第一个 <T> Collection<T> byType(Class<T> type); //根据身份类型获取一组 List asList(); //转换为 List Set asSet(); //转换为 Set Collection fromRealm(String realmName); //根据 Realm 名字获取 Set<String> getRealmNames(); //获取所有身份验证通过的 Realm 名字 boolean isEmpty(); //判断是否为空 }
因为PrincipalCollection聚合了多个,此处最需要注意的是getPrimaryPrincipal,如果只有一个Principal那么直接返回即可,如果有多个Principal,则返回第一个(因为内部使用Map存储,所以可以认为是返回任意一个);oneByType / byType根据凭据的类型返回相应的Principal;fromRealm根据Realm名字(每个Principal都与一个Realm关联)获取相应的Principal。
MutablePrincipalCollection是一个可变的PrincipalCollection接口,即提供了如下可变方法:
public interface MutablePrincipalCollection extends PrincipalCollection { void add(Object principal, String realmName); //添加 Realm-Principal 的关联 void addAll(Collection principals, String realmName); //添加一组 Realm-Principal 的关联 void addAll(PrincipalCollection principals);//添加 PrincipalCollection void clear();//清空 }目前 Shiro只提供了
MutablePrincipalCollection
的一个实现 SimplePrincipalCollection
,在多 Realm 时 SimpleAuthenticationInfo 会合并多个 Principal为一个 PrincipalCollection。
Shiro 中的 AuthorizationInfo
AuthorizationInfo用于聚合授权信息的:
public interface AuthorizationInfo extends Serializable { Collection<String> getRoles(); //获取角色字符串信息 Collection<String> getStringPermissions(); //获取权限字符串信息 Collection<Permission> getObjectPermissions(); //获取 Permission 对象信息 }
当我们使用 AuthorizingRealm
时,如果身份验证成功,在进行授权时就通过doGetAuthorizationInfo
方法获取角色/权限信息用于授权验证。Shiro 提供了一个实现 SimpleAuthorizationInfo
,大多数时候使用这个即可。