这几天在研究 spring Security oauth 等相关的框架
参照例子进行配置,代码不描述,总之产生了下面的地址
有2个地址,分别使用以下方式登录:
1: /app/oauth/token -> basic
2: /app/hi -> form
总共两种认证方式,分别是 basic,form
两种认证分开认证不同的账号体系,也不会公用(basic认证之后还是会form,反之一样)
实现效果没问题,都符合预期,如果只是到这一步结束的话。
----------------------------------------
这个时候我手贱加了一个新地址(与2使用同一个认证):
3: /app/oauth/hi -> form
出现问题:
当按照 1,2,3 的顺序去访问时,3将会被重新导航到登录页面,也就是说2的认证session丢失了
但按照 1,3(2),2 的顺序时,却不会导航到登录页面
丢失原因:
这个问题困扰我很久,花了很长时间各种去调试,检查了配置等等。
2,3 确实是使用的同一个认证链。没有问题
最终发现,因为 3 的地址请求header中带了: Authorization: Basic。
而我security采用的是默认配置,会进入到 BasicAuthenticationFilter ,导致认证失败,清空了session
到这一步也算差不多找到了问题原因,在使用form的认证链配置中关掉basic即可
-----------------------------------------
一个新问题:
为什么 2,3 同一个系统的地址,一个会带上 Authorization: Basic,一个又不会?
最后:
最终的问题原因,重现都已经通过例子进行了验证
通常对于cookie浏览器都是使用ip,域名来进行存储分离,比如session
比如: 我如果在 localhost 下存储了一个 sessionId=1的数据,在下面的地址都可以拿到
1: localhost/app/oauth/token
2: localhost/app/hi
3: localhost/app/oauth/hi
而下面的地址拿不到,这就是所谓的跨域问题了。
1: 127.0.0.1/app/oauth/token
2: 127.0.0.1/app/hi
3: 127.0.0.1/app/oauth/hi
但是 Authorization: Basic 好像跟这个不一样,它有一个"上下文"的概念,也就是context-path。但又有一些差别
比如:下面几个地址,一般认为的上下文
1. localhost/app/oauth/token -> app
2. localhost/app/oauth/b/token -> app
3. localhost/app/hi -> app
4. localhost/app/b/hi -> app
5. localhost/app2/oauth/token -> app2
6. localhost/app2/oauth/b/hi -> app2
但是 Authorization: Basic 却认为:
1. localhost/app/oauth/token -> app/oauth
2. localhost/app/oauth/b/token -> app/oauth/b
3. localhost/app/hi -> app
4. localhost/app/b/hi -> app/b
5. localhost/app2/oauth/token -> app2/oauth
6. localhost/app2/oauth/b/hi -> app2/oauth/b
你的请求路径必须要是认证路径的子路径
比如:
通过 1 进行了认证,请求 2,3 都会带上认证信息,但请求 4 就不会
最后,虽然苦逼的弄清楚了这个问题,但相关文档却找不到
这个问题分享出来,希望能给跟我一样被这个问题困扰的同学一些帮助