shiro身份验证流程
token委托
- Subject调用login(token) 方法,将用户产生的token委托给SecurityManager
- SecurityManager将token委托给Authenticator
- Authenticator将token委托给子类ModularRealmAuthenticator进行身份验证的处理
ModularRealmAuthenticator会根据注入Realm的个数决定验证流程
单Realm情况
- ModularRealmAuthenticator调用doSingleRealmAuthentication(realm,token)方法
- 直接比对Realm(含有正确的身份/凭证)和token的身份/凭证
- 验证成功则返回身份认证信息AuthenticationInfo;验证失败则抛出相应的验证异常
多Realm情况
- ModularRelamAuthenticator调用doMultiRealmAuthentication(realms,token)方法
- 获取默认验证策略AtLeastOneSuccessfulStrategy(只要有一个Realm验证成功即可,并返回所有验证成功的身份认证信息)【用户可自定义策略】
- [逐一比对]Realm(含有正确的身份/凭证)和token的身份/凭证
- token仅需要匹配一个Realm的身份/凭证即表示验证成功,而后返回所有验证成功的身份认证信息AuthenticationInfo;在比对时,每有一个Realm验证失败则抛出一个相应的异常
shiro身份授权流程
访问控制--角色控制
- 此方式进行权限控制,其粒度粗,先判断用户是否具备某些角色,而后需要手动对用户进行可操作的资源授权
- 判断角色的方法包括(以下均是触发身份授权流程的方法,调用者为Subject):
- hasRole(String var1)、hasRoles(List<String> var1)、hasAllRoles(Collection<String> var1)
- checkRole(String var1)、checkRoles(String... var1)、checkRoles(Collection<String> var1)
访问控制--权限控制
- 此方式进行权限控制,其粒度细, 直接判断用户是否具备某些资源的可操作权限
- 判断权限的方法包括(以下均是触发身份授权流程的方法,调用者为Subject):
- isPermitted(String var1)、isPermitted(String... var1)、isPermitted(Permission var1)、isPermitted(List<Permission> var1)、isPermittedAll(String... var1)、isPermittedAll(Collection<Permission> var1)
- checkPermission(String var1)、checkPermissions(String... var1)、checkPermission(Permission var1)、checkPermissions(Collection<Permission> var1)
注意:
① has、is开头的方法判断用户是否具备角色、权限时,返回true表示具备、返回false表示不具备
② check开头的方法判断用户是否具备角色、权限时,无任何返回表示具备、抛出UnauthorizedException异常表示不具备
角色/权限字符串委托
- 身份认证成功的Subject调用上述任意一种判断方法,将需要验证的角色/权限字符串委托给SecurityManager
- SecurityManager将角色/权限字符串委托给Authorizer
- Authorizer将角色/权限字符串委托给子类ModularRealmAuthorizer进行身份授权的处理
ModularRealmAuthorizer身份授权处理
- ModularRealmAuthorizer首先会获取Subject身份验证成功的Realm集合,并[逐一判断]该Realm是否实现Authorizer,如果实现则通过Realm调用上述相应的判断方法委托给AuthorizingRealm类处理
- AuthorizingRealm类会根据传入字符串的粒度(角色字符串/权限字符串)进行不同的处理
- 粗粒度(角色字符串)处理
AuthorizingRealm执行Realm中的doGetAuthorizationInfo方法,此方法专用于查询用户的角色以及权限信息,即授权专用方法.
(若用户需要自定义Realm,可继承AuthorizingRealm并重写doGetAuthorizationInfo身份授权专用方法与doGetAuthenticationInfo身份验证方法即可)
doGetAuthorizationInfo方法执行完后,返回AuthorizationInfo对象,此对象包含此用户的角色与权限信息,然后使用Subject传递的角色字符串依次进行比较,匹配则返回相应类型的值.
- 细粒度(权限字符串)处理(权限字符串需要转换成权限对象方可执行授权逻辑)
AuthorizingRealm先将"权限字符串"委托给PermissionResolver,
PermissionResolver委托给子类WildcardPermissionResolver将"权限字符串"转换成权限实例,
AuthorizingRealm执行Realm中的doGetAuthorizationInfo方法,此方法专用于查询用户的角色以及权限信息,即授权专用方法.
(若用户需要自定义Realm,可继承AuthorizingRealm并重写doGetAuthorizationInfo身份授权专用方法与doGetAuthenticationInfo身份验证方法即可)
doGetAuthorizationInfo方法执行完后,返回AuthorizationInfo对象,
此对象包含此用户的角色与权限信息.
Subject传递的角色字符串依次进行比较,匹配则返回相应类型的值.