2021-04-06 SpringSecurity登录 跨域JSESSIONID失效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-04-06 SpringSecurity登录 跨域JSESSIONID失效相关的知识,希望对你有一定的参考价值。

参考技术A SpringBoot + SpringSecurity + 前后端分离 (前端 127.0.0.1:8848,后端 localhost:8998)

登录和其他请求的JSESSIONID(存入cookie内)不同,导致其他请求给后端的JSESSIONID为未登录的无效SESSIONID,提示未登录。

顺序:登录(/login) ---> 组织结构(/depts) ---> 个人信息(/staff/getOne/wld)
登录:响应Cookie

组织结构:响应Cookie

个人信息:请求Cookie

后端

顺序:登录(/login) ---> 个人信息(/staff/getOne/wld) ---> 组织结构(/depts)
登录:响应Cookie

个人信息:无Cookie

组织结构:响应Cookie

后端

A、B两次的测试登录和其他的操作Cookie都不同,说明后端响应请求成功,但响应JSESSIONID并没有存入到本地,以致后序的操作拿不到Cookie中的JSESSIONID,能获取后端传来JSESSIONID的拿到了一个新的JSESSIONID(A中组织结构),不能获取后端传来JSESSIONID的也没有请求Cookie(B中个人信息)。

开启withCredentials后,服务器才能拿到你的cookie。当然后端服务器也要设置允许你获取你开启了才有用(之前有设置)

login.html(登录):没有开启
show-inform.html(个人信息):开启
struct-tree.html(组织结构):开启 (但是dataType没有指定,所以在A、B测试中其均有响应Cookie)

SpringSecurity中登录的过滤器

其他请求的过滤器

1、每次调试前,浏览器缓存、cookie啥的清除干净,方便查找问题
2、改动要完整,要清楚是干什么的(前端login.html没有开启withCredentials是这次的主要问题)

springsecurity密码登录的流程分析

参考技术A 一、用户名密码登录处理过程(spring security实现的处理流程):

1.密码登录的请求会进入一个叫做UsernamePasswordAuthenticationFilter的过滤器
2.这个过滤器会拿到用户名和密码组装成UsernamePasswordAuthenticationToken这样一个对象
3.然后过滤器把这个token对象传给AuthenticationManager
4.AuthenticationManager会在一堆AuthenticationProvider中挑出一个处理认证请求
这个挑选的依据是:这个authenticationProvider中有一个supports()方法会判断当前这个provider是否支持传进来的UsernamePasswordAuthenticationToken,如果支持,就用当前的Provider来认证这个token。
5.在认证的过程中会调UserDetailsService来获取用户的信息,跟传进来的登录信息进行比对,如果认证通过会把UsernamePasswordAuthenticationToken 做一个标志,标记为已认证放进session中。

二、手机号验证码登录处理过程:(spring security没有实现,应该我们自己去仿照用户名密码登录去实现)

1.短信验证码登录的请求进入我们自己写的SmsAuthenticationFilter过滤器
2.这个过滤器会从请求中拿到手机号封装成一个SmsAuthenticationToken这样一个对象
3然后过滤器会把这个token传给系统中唯一的AuthenticationManager
4.AuthenticationManager还是会检索系统中的所有的AuthenticationProvider,这里我们要实现一个SmsAuthenticationProvider,
用这个provider来检索token中的手机号。
5.这个过程中还是会调用UserDetailsService来获取用户信息,来跟登录信息进行比对,如果认证通过会把SmsAuthenticationToken 标志为已认证,放进session中。

注意:为什么验证短信验证码的逻辑不像用户名密码的验证逻辑写在DaoAuthenticationProvider一样写在SmsAuthenticationProvider中呢?主要是因为我们想要重用这个短信验证,例如支付的时候需要短信验证,所以我们单独写一个过滤器来实现短信验证码的功能,放在SmsAuthenticationFilter之前。

以上是关于2021-04-06 SpringSecurity登录 跨域JSESSIONID失效的主要内容,如果未能解决你的问题,请参考以下文章

[POC分享]CVE-2021-04-06 vsftpd 3.0.3 - Remote Denial of Service

MDK5.29,5.30,5.31,5.32,5.33, 5.34和各种pack软件包镜像下载(2021-04-06)

springsecurity密码登录的流程分析

SpringSecurity——基本原理

SpringSecurity框架教程-简介与SpringSecurity框架教程-入门案例准备工作

SpringSecurity坑