1. 首页
  2. >
  3. 技术专题
  4. >
  5. SpringCloud

SpringBoot + Shiro登出源码解析

项目里面配置shiro退出的url为filterChainDefinitionMap.put("/logout",“logout”),最终会调用到org.apache.shiro.subject.support.DelegatingSubject

的logout方法,截图如下:

SpringBoot + Shiro登出源码解析


接着调用了org.apache.shiro.web.mgt.DefaultWebSecurityManager的logout方法,方法截图如下:

SpringBoot + Shiro登出源码解析


SpringBoot + Shiro登出源码解析


首先调用了beforeLogout方法,该方法判断项目里面是否配置了记住我的功能,如果配置了需要告诉浏览器删除存在的Cookie,截图如下:

SpringBoot + Shiro登出源码解析


先从DefaultWebSecurityManager对象成员对象获取CookieRememberMeManager对象,如果不为空,调用CookieRememberMeManager对象的onLogout方法

最终调用到SimpleCookie的removeFrom方法,截图如下:

SpringBoot + Shiro登出源码解析


最重要的是设置Cookie的maxAge属性为0,表示要删除浏览器存在的Cookie,然后构建了一个变量headerValue,添加到response对象返回给浏览器,此方法执行

完成返回到DefaultWebSecurityManager的logout方法获取代表当前对象登录信息的对象PrincipalCollection对象,判断如果不为空,接着调用ModularRealmAuthenticator.onLogout方法,进行事件通知,回调AuthenticationListener

实现类的onLogout方法,查找所有注册了的Realm实现类,方法截图如下:

SpringBoot + Shiro登出源码解析


获取自定义的Realm一般都是继承自AuthorizingRealm而AuthorizingRealm间接实现了LogoutAware接口,所以对于登出时的自定义操作. 我们可以选择在自定义Realm中通过覆写onLogout来完成。

如果没有复写onLogout则调用父类方法清除用户信息。

接着调用DefaultWebSecurityManager对象的delete方法,最终调用到DefaultSubjectDAO对象的removeFromSession方法,截图如下:

SpringBoot + Shiro登出源码解析


首先获取session,然后移除session对象代表用户是否认证的key,该key是DefaultSubjectContext.class.getName() + “_AUTHENTICATED_SESSION_KEY”,

之后移除session对象代表用户信息的key,该key是DefaultSubjectContext.class.getName() + “_PRINCIPALS_SESSION_KEY”,至此delete方法执行完成。

最终回到DefaultWebSecurityManager对象的logout方法,进入finally代码块,执行stopSession, 停止session; 调用Shiro自身定义的Session接口的stop方法进行后续session的操作。

总结:shiro退出方法是返回浏览器一个Cookie过期的时间为maxAge=0,删除了浏览器的记住我的Cookie,删除已经登录用户的用户信息,删除session中保存用户认证和登录信息的key值。

基于阿里Ant Design构建的高颜值开源管理后台UI框架
« 上一篇 2020年12月16日 am07:45
苹果宣布正式推出轻 App 码
下一篇 » 2020年12月16日 am08:00

相关推荐