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

- 应用程序构建了一个终端用户认证信息的
AuthenticationToken实例类,然后调用subject.login方法 -
Subject的实例通常是DelegatingSubject类的实例对象,在认证开始时,它会委托应用程序设置的SecurityManager实例,调用securitymanager.login(token)方法 -
SecurityManager在接收到token令牌信息后,会委托内置的Authenticator实例调用authenticator.authenticate(token)来进行认证,这里面的Authenticator实例通常使用的是ModularRealmAuthenticator实例,ModularRealmAuthenticator在认证过程中会对设置的一个或者多个Realm实例进行适配,它实际上是为shiro提供了一个可插拔的认证机制。 - 如果我们在程序中配置了多个
Realm,ModularRealmAuthenticator会根据配置的AuthenticationStrategy来进行多Realm的认证过程,
在Realm被调用后,AuthenticationStrategy将会对每一个Realm的结果做出响应。
这里需要注意,如果应用程序中只配置了一个Realm,Realm将直接调用,而无需配置认证策略 - 我们需要判断每一个
Realm是否支持提交的AuthenticationToken,如果支持,Realm将调用getAuthenticationInfo(token)方法,这个方法就是实际的认证处理,我们通过覆盖Realm的doGetAuthenticationInfo方法来编写我们自定义的认证处理即可。
Shiro授权
授权,也叫访问控制,即在应用中控制谁能访问哪些资源,比如访问页面、编辑数据、页面操作等等。
在授权中,需要了解几个关键的对象,主体 - subject,资源 - resource,权限 - permission,角色 - role
授权流程
通过shiro的授权流程图来说明shiro授权的处理顺序:

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