后台管理系统,使用技术如下。
后端: spring云,springsecurity
前端: AntDesign Pro v4,React
前端有多个项目,在本地开发时,多个前端项目在不同的端口上启动,部署到环境中,然后通过同一一级域名下的两个不同的二级域名访问两个前端系统要求系统之间的session可以共享。
问题说明对于本地开发,可以通过从localhost:8000和localhost:8001访问两个前端系统进行会话共享。 假设localhost:8000访问的前端为系统a,localhost:8001访问的前端为系统b。 登录a后,无需登录即可通过a跳转到b。 反之亦然,当系统a注销时,系统b也同样注销。
在部署到环境之后,a.xx.com访问系统a,b.xx.com被定位为访问系统b,但是在系统a登录后,它没有权限通过系统a跳转到系统b
下图显示了未通过验证的AuthenticationEntryPoint类的AuthenticationException。
以上是问题的说明。 也就是说,session不能在同一主域名下的不同辅助域名之间共享。
解决方案的第一步是尝试本地再现问题,当本地通过localhost:8000和localhost:8001访问时,两者可以相互跳转,没有session没有共享的问题,本地再现
第二步,谷歌或百度“前车之鉴”,springsecurity session; spring跨域会话; 设置不同的关键字搜索(如cookie ),找到解决方法之一,在以下配置中指定cookie域,尝试后无效:
第三步尝试观察验证失败的错误消息。 抛出的异常:从insufficientauthenticationexception抛出异常的代码ExceptionTranslationFilter、SessionManagementFilter,然后从spring中尝试
在第4步中,前三个步骤的尝试几乎确定了是Spring Security或Spring Session的问题,因此我们决定直接访问Spring官方网站查找答案。
3359 spring.io/projects/spring-security
如下图所示,Spring Security的三个项目很快就通过了一次,发现没有有价值的信息。
因为我们的系统使用的是redis存储会话,所以我们可以直接浏览Spring Session中的Spring Session Data Redis一栏,直接去LEARN,找到最新的参考文档(这里需要注意版本。 因为我使用的是比较新的版本,所以我直接选择了Current的文档。 )
根据上述故障诊断步骤,可以推测问题与域相关,因此我们使用域关键字进行了全文检查。 最终,请访问This allows sharing a session across domains and applications.
到目前为止,我基本上可以断定这一部分可以解决我的问题,所以我可以根据文档内容定制CookieSerializer,将domain定义为所需的一级域名,例如xx.com
很好。 引入环境后,系统之间的跳转成功,问题得到解决!
此外,虽然spring的官方文档还介绍了名为domainName的参数,但该参数很容易理解,实际开发中通常需要在重新开发环境和生产环境中使用不同的配置,这很麻烦,也不灵活
后官方文档yyds!