Shiro身份验证/授权源码学习小结

shiro身份验证流程

token委托

  1.  Subject调用login(token) 方法,将用户产生的token委托给SecurityManager
  2.  SecurityManager将token委托给Authenticator
  3.  Authenticator将token委托给子类ModularRealmAuthenticator进行身份验证的处理

ModularRealmAuthenticator会根据注入Realm的个数决定验证流程

单Realm情况

  1.  ModularRealmAuthenticator调用doSingleRealmAuthentication(realm,token)方法
  2.  直接比对Realm(含有正确的身份/凭证)和token的身份/凭证
  3.  验证成功则返回身份认证信息AuthenticationInfo;验证失败则抛出相应的验证异常

多Realm情况

  1.  ModularRelamAuthenticator调用doMultiRealmAuthentication(realms,token)方法
  2.  获取默认验证策略AtLeastOneSuccessfulStrategy(只要有一个Realm验证成功即可,并返回所有验证成功的身份认证信息)【用户可自定义策略】
  3.  [逐一比对]Realm(含有正确的身份/凭证)和token的身份/凭证
  4.  token仅需要匹配一个Realm的身份/凭证即表示验证成功,而后返回所有验证成功的身份认证信息AuthenticationInfo;在比对时,每有一个Realm验证失败则抛出一个相应的异常

shiro身份授权流程  

 访问控制--角色控制

  1. 此方式进行权限控制,其粒度粗,先判断用户是否具备某些角色,而后需要手动对用户进行可操作的资源授权
  2. 判断角色的方法包括(以下均是触发身份授权流程的方法,调用者为Subject):
  • hasRole(String var1)、hasRoles(List<String> var1)、hasAllRoles(Collection<String> var1)
  • checkRole(String var1)、checkRoles(String... var1)、checkRoles(Collection<String> var1)

 访问控制--权限控制

  1.  此方式进行权限控制,其粒度细, 直接判断用户是否具备某些资源的可操作权限
  2.  判断权限的方法包括(以下均是触发身份授权流程的方法,调用者为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异常表示不具备

角色/权限字符串委托

  1. 身份认证成功的Subject调用上述任意一种判断方法,将需要验证的角色/权限字符串委托给SecurityManager
  2. SecurityManager将角色/权限字符串委托给Authorizer
  3. Authorizer将角色/权限字符串委托给子类ModularRealmAuthorizer进行身份授权的处理

 ModularRealmAuthorizer身份授权处理

  1. ModularRealmAuthorizer首先会获取Subject身份验证成功的Realm集合,并[逐一判断]该Realm是否实现Authorizer,如果实现则通过Realm调用上述相应的判断方法委托给AuthorizingRealm类处理
  2. 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传递的角色字符串依次进行比较,匹配则返回相应类型的值.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值