Shiro身份验证----subject提交

  

获取subject对象

1、SecurityUtils.getSubject()

2、调用的是ThreadContext

Shiro身份验证----subject提交_第1张图片

2、从ThreadContext获取Subject

1、其内部有静态创建了ThreadLocal>

2、获取subject的key:org.apache.shiro.util.ThreadContext_SUBJECT_KEY

3、WebDelegationgSubject

Shiro身份验证----subject提交_第2张图片

3、调用login方法

1、创建usernamepasswordtoken

此处验证Remember是否启用

Shiro身份验证----subject提交_第3张图片

             2、进入login方法

1、clear run as identities internal

清除内部运行身份

2、获取session,无则不创建,有删除RUN_AS_PRINCIPALS_SESSION_KEY的值

注意:

获取session方法在DelegationgSubject类中,

Shiro身份验证----subject提交_第4张图片

4、调用securitymanager的login方法:

该实例对象为DefaultSecurityManager

1、info = authenticate(token);

该步为了获取用户真实信息

1、获取realms,并进行验证

2、ModularRealmAuthenticator为realm管理

2、返回info若是为空则表示验证不成功

notifyfail(token, info);

成功则:notifySuccess(token, info);

此处有AuthenticationListener监听器:

监听验证登录情况:

可以扩展ip限制登录次数,该用用户短时间不能在登录

Shiro身份验证----subject提交_第5张图片

5、返回到login方法执行createsubject(token,info,subject)

Shiro身份验证----subject提交_第6张图片

6、

1、创建SubjectContext:

subject容器:1、sessionid等所有信息

Shiro身份验证----subject提交_第7张图片

subject容器:1、设置用户验证成功true

2、存入token和info

3、存入existing即subject

Shiro身份验证----subject提交_第8张图片

7、调用createSubject(context)

以下是方法讲解:

1、copy将context中属性全部复制到DefaultSecurityManager中的DefaultSubjectcontext

2、查看容器里有没有securitymanager,无则从ThreadContext创建

3、查看容器里面有没有session(暂时不懂其方法)

4、查看容器里面有没有用户信息

5、通过context创建subuject

Shiro身份验证----subject提交_第9张图片

Shiro身份验证----subject提交_第10张图片

1、

Shiro身份验证----subject提交_第11张图片

2、查看容器里有没有securitymanager,无则从ThreadContext创建

Shiro身份验证----subject提交_第12张图片

最终:创建WebDelegatingSubject

注意此处的SessionEnabled修改为true了,之前所有创建session都为false导致创建失败

Shiro身份验证----subject提交_第13张图片

你可能感兴趣的:(Shiro身份验证----subject提交)