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表示授权失败。