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身份验证。
Realm
Shiro从Realm
获取安全数据(如用户、角色、权限),就是说SecurityManager
要验证用户身份,那么它需要从Realm
获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm
得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm
看成DataSource
,即安全数据源。如我们之前的ini配置方式将使用org.apache.shiro.realm.text.IniRealm
.
Authenticator
-
SecurityManager
接口继承了Authenticator
,ModularRealmAuthenticator
实现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:*