shiro框架 身份认证流程

身份认证流程

  • 首先调用Subject.login(token)进行登录,其会自动委托给Security Manager,调用之前必须通过SecurityUtils.setSecurityManager()设置;
  • Security Manager负责真正的身份验证逻辑,它会委托给Authenticator进行身份验证;
  • Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现;
  • Authenticator会把响应的token传入Realm,从Realm获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照响应的顺序及策略进行访问;
  • Authenticator可能会委托给响应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证。
  • shiro框架 身份认证流程

Realm

Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。如我们之前的ini配置方式将使用org.apache.shiro.realm.text.IniRealm.
shiro框架 身份认证流程

Authenticator

  • SecurityManager接口继承了AuthenticatorModularRealmAuthenticator实现 Authenticator,多个Realm进行验证,验证规则通过AuthenticationStrategy
  • FirstSuccessfulStrategy 只要有一个Realm验证成功即可,只返回第一个Realm身份验证成功的认证信息,其他的忽略
  • AtLeastOneSuccessfulStrategy 只要有一个Realm验证成功即可,返回所有验证成功的认证信息(默认策略)
  • AllSuccessfulStrategy 所有Realm验证成功才算成功,且返回所有Realm身份验证成功的认证信息,如果有一个失败就失败了

    授权

    授权核心对象
  • 主体(Subject)

  • 资源(Resource)
  • 权限(Permission)
  • 角色(Role)
    隐式角色:通过角色来验证用户有没有操作权限
    显式角色:通过权限控制谁能访问某个资源,角色聚合一组权限集合

    权限格式

    规则:资源标识符:操作:对象实例ID
    “*”:表示任意通配符
    如:user:add:1、user:update:1、user:delete:1、user:*