获取subject对象
1、SecurityUtils.getSubject()
2、调用的是ThreadContext
2、从ThreadContext获取Subject
1、其内部有静态创建了ThreadLocal
2、获取subject的key:org.apache.shiro.util.ThreadContext_SUBJECT_KEY
3、WebDelegationgSubject
3、调用login方法
1、创建usernamepasswordtoken
此处验证Remember是否启用
2、进入login方法
1、clear run as identities internal
清除内部运行身份
2、获取session,无则不创建,有删除RUN_AS_PRINCIPALS_SESSION_KEY的值
注意:
获取session方法在DelegationgSubject类中,
4、调用securitymanager的login方法:
该实例对象为DefaultSecurityManager
1、info = authenticate(token);
该步为了获取用户真实信息
1、获取realms,并进行验证
2、ModularRealmAuthenticator为realm管理
2、返回info若是为空则表示验证不成功
notifyfail(token, info);
成功则:notifySuccess(token, info);
此处有AuthenticationListener监听器:
监听验证登录情况:
可以扩展ip限制登录次数,该用用户短时间不能在登录
5、返回到login方法执行createsubject(token,info,subject)
6、
1、创建SubjectContext:
subject容器:1、sessionid等所有信息
subject容器:1、设置用户验证成功true
2、存入token和info
3、存入existing即subject
7、调用createSubject(context)
以下是方法讲解:
1、copy将context中属性全部复制到DefaultSecurityManager中的DefaultSubjectcontext
2、查看容器里有没有securitymanager,无则从ThreadContext创建
3、查看容器里面有没有session(暂时不懂其方法)
4、查看容器里面有没有用户信息
5、通过context创建subuject
1、
2、查看容器里有没有securitymanager,无则从ThreadContext创建
最终:创建WebDelegatingSubject
注意此处的SessionEnabled修改为true了,之前所有创建session都为false导致创建失败