Shiro认证与授权

Shiro身份认证

身份认证:就是应用中谁能证明他就是他本人,一般提供如他们身份的ID、一些标识信息来表名他就是他本人,如提供身份证,用户名、密码来证明。
shiro中做身份认证的是Authenticator,它是一个认证器,负责主体认证的,这是一个扩展点,如果用户觉得默认实现不好,可以自定义实现。认证器需要认证策略,这个也需要自己实现。

认证流程

通过shiro认证的流程图来说明认证内部的处理顺序:

Shiro认证与授权_第1张图片
  1. 应用程序构建了一个终端用户认证信息的 AuthenticationToken 实例类,然后调用 subject.login 方法
  2. Subject 的实例通常是 DelegatingSubject 类的实例对象,在认证开始时,它会委托应用程序设置的 SecurityManager 实例,调用 securitymanager.login(token) 方法
  3. SecurityManager 在接收到token令牌信息后,会委托内置的 Authenticator 实例调用 authenticator.authenticate(token) 来进行认证,这里面的 Authenticator 实例通常使用的是 ModularRealmAuthenticator 实例,ModularRealmAuthenticator 在认证过程中会对设置的一个或者多个 Realm 实例进行适配,它实际上是为shiro提供了一个可插拔的认证机制。
  4. 如果我们在程序中配置了多个 RealmModularRealmAuthenticator 会根据配置的 AuthenticationStrategy 来进行多 Realm 的认证过程,
    Realm 被调用后,AuthenticationStrategy 将会对每一个Realm的结果做出响应。
    这里需要注意,如果应用程序中只配置了一个 RealmRealm 将直接调用,而无需配置认证策略
  5. 我们需要判断每一个 Realm 是否支持提交的 AuthenticationToken,如果支持,Realm 将调用 getAuthenticationInfo(token) 方法,这个方法就是实际的认证处理,我们通过覆盖 RealmdoGetAuthenticationInfo 方法来编写我们自定义的认证处理即可。

Shiro授权

授权,也叫访问控制,即在应用中控制谁能访问哪些资源,比如访问页面、编辑数据、页面操作等等。
在授权中,需要了解几个关键的对象,主体 - subject,资源 - resource,权限 - permission,角色 - role

授权流程

通过shiro的授权流程图来说明shiro授权的处理顺序:

Shiro认证与授权_第2张图片
  1. 首先会调用subject的 hasRole* 或者 isPermitted* 方法来进行处理
  2. 它会委托给 SecurityManager,而 SecurityManager 接着会委托给 Authorizer
  3. Authorizer 是真正的授权者,比如判断是否拥有user的查看权限,这时候调用方法 isPermitted,传入参数是 user:view
    它首先会通过 PermissionResolver 把字符串转换成相应的 Permission 实例,在进行授权之前,它会调用相应的realm获取
    subject相应的角色权限用于匹配传入的角色权限,
  4. 最后 Authorizer 会判断realm的角色权限是否和传入的匹配,如果有多个
    realm,则会委托给 ModularRealmAuthorizer 进行循环判断,如果匹配,那么 isPermitted 或者 hasRole 方法会返回true,否则返回false表示授权失败。

你可能感兴趣的:(Shiro认证与授权)