Shiro学习
1.Shiro身份认证流程
-
1.首先调用最外层的Subject.login(token)进行登录,Subject会将身份认证任务委派给SecurityManager
-
2.SecurityManager又将身份验证功能委派给Authenticator进行身份验证
-
3.Authenticator是身份验证接口,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现
-
4.Authenticator接口会将验证任务交给AbstractAuthenticator进行具体的身份认证逻辑验证负责异常信息的报错和打印认证结果日志,验证过程默认由ModularRealmAuthenticator进行验证
-
- 5.1获取Realm的个数,如果Realm只有一个,采用首先判断token类型是否兼容,如果兼容的话优先使用Cache进行身份认证,否则采用以下几种方式(JDBC,ini)进行认证
- 5.2如果Realm的个数多于1个,那么查看ModularRealmAuthenticator采用的哪一种认证策略进行认证,随后依次验证Realm,验证过程类似
2.shiro角色校验流程
- 1.首先调用最外层的subject.hasRole(role)进行角色校验,subject会将角色校验任务委派给SecurityManager
- 2.SecurityManager又将角色验证功能委派给Authorizer角色校验
- 3.Authorizer先将角色校验任务委派给ModularRealmAuthorizer进行角色校验,判断是否只有一个Realm对象
- 4.如果只有一个Realm对象,那么ModularRealmAuthorizer将会将角色校验任务委派给AuthorizingRealm,
最终会通过AuthorizingRealm.hasRole(roleIdentifier, info)进行最终的角色校验,判断对应的用户是否具有相应的角色
其中对象参数info是AuthorizationInfo类,AuthorizationInfo类中会封装关于客户端(前端)用户身份角色权限的所有信息,
如果具有相应的角色那么返回true,否则返回false
- 5.如果有多个Realm对象,那么会遍历Realm对象,仍然根据上述步骤进行角色校验
3.shiro的权限校验流程
3、授权流程
- 1.首先调用最外层的subject.isPermitted(permission)进行权限校验,subject会将权限校验任务委派给SecurityManager
- 2.SecurityManager又将权限验证功能委派给Authorizer进行权限校验
- 3.Authorizer先将权限校验任务委派给ModularRealmAuthorizer进行权限校验,判断是否只有一个Realm对象
- 4.如果只有一个Realm对象,那么ModularRealmAuthorizer会将权限校验任务委派给AuthorizingRealm,
最终会通过AuthorizingRealm.isPermitted(principals, permission)进行最终的权限校验,判断对应的用户是否具有该权限
其中对象参数permission是字符串类,如果具有相应的权限那么返回true,否则返回false
- 5.如果有多个Realm对象,那么会遍历Realm对象,仍然根据上述步骤进行权限校验
4.AuthenticationInfo和AuthenticationToken的关系
- Shiro是一个强大且易用的Java安全框架,它提供了许多用于身份验证、授权、加密和会话管理的功能。在Shiro中,AuthenticationInfo和AuthenticationToken都是与身份验证相关的关键组件。
AuthenticationInfo: AuthenticationInfo代表了身份验证的信息。这个信息通常包含了用户的身份(如用户名或主体)以及任何与身份验证相关的元数据。AuthenticationInfo实例通常在成功完成身份验证过程后创建,并可以包含从用户处收集的任何附加信息。
例如,在用户登录过程中,一旦用户名和密码通过验证,Shiro将创建一个AuthenticationInfo实例,其中包含用户名和其他可能的信息(如角色、权限等)。 2. AuthenticationToken:
AuthenticationToken是用于身份验证的令牌。它通常包含了将要进行身份验证的用户的信息(如用户名和密码),以及任何其他相关的身份验证数据。AuthenticationToken是用户提供给系统以证明其身份的对象。
例如,在一个基于表单的身份验证过程中,AuthenticationToken可能包含从表单提交的用户名和密码。当Shiro接收到这个令牌时,它将对其进行验证以确定用户的身份。
关系:
AuthenticationToken和AuthenticationInfo之间的关系是前后关联的。也就是说,我们使用AuthenticationToken进行身份验证,然后根据这个令牌的结果创建AuthenticationInfo实例。
简单来说,我们可以把AuthenticationToken看作是用于启动身份验证过程的“钥匙”,而AuthenticationInfo则是身份验证过程结束后的结果,包含了用户的身份和其他相关信息。