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实现了 RememberMeAuthenticationTokenHostAuthenticationToken,可以实现“记住我”及“主机验证”的支持。

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的一个实现。在 IniRealmPropertiesRealm这种静态创建帐号信息的场景中使用,这些 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,大多数时候使用这个即可。

最新文章

  1. 2016BUAA校赛决赛
  2. [dataTables.js error] Uncaught TypeError: myTable.row is not a function
  3. Android 从java字节码告诉你 为什么Handler会造成内存泄露
  4. HDU 1166 敌兵布阵 (线段树 单点更新)
  5. 设置mysql 在mac中的环境变量
  6. Windows7 下配置添加ASP功能
  7. 16位cpu下主引导扇区及用户程序的编写
  8. python面向对象的继承
  9. SQL注入攻击三部曲之进阶篇
  10. JavaScript(第十三天)【内置对象】
  11. Python3实现ICMP远控后门(下)之“Boss”出场
  12. 微服务架构 - CentOS7离线部署docker
  13. BZOJ3033太鼓达人——哈密顿回路/欧拉回路
  14. Linux常用命令之链接命令和权限管理命令
  15. MySQLi面向对象实践--multi_query
  16. 关于spire wb.SaveToPdf(f_pdf) excell 转为pdf 乱码问题
  17. 微信小程序开发--背景图显示
  18. Ionic 命令
  19. Oracle管理监控之rlwrap-0.37.tar.gz实现sqlplus上下翻页
  20. Linux的管道命令

热门文章

  1. app添加引导页
  2. 阿里云VPS(win系统)装ROS教程
  3. Nginx+tomcat实现负载均衡的配置
  4. 031:Cetus sharding
  5. 年薪30万的Android程序员必须知道的帖子
  6. Oracle 性能调优之:使用 V$SQL_PLAN 视图查询内存中的执行计划
  7. Sql2008 全文索引 简明教程
  8. SpringBoot入门篇--对于JSON数据的返回以及处理一
  9. PHP 成长规划
  10. JS 位数不够自动左补0