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

本文详细解析了Shiro安全框架的登录流程,包括Subject对象的获取、RememberMe功能的验证、Session的处理以及通过SecurityManager进行用户认证的过程。深入探讨了ModularRealmAuthenticator在realm验证中的作用及登录成功的Subject创建。

  

获取subject对象

1、SecurityUtils.getSubject()

2、调用的是ThreadContext

2、从ThreadContext获取Subject

1、其内部有静态创建了ThreadLocal<Map<Object,Object>>

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导致创建失败

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值