用户登录-单点登录

首先是为啥要用单点登录的问题,单点登录也就是SSO

SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

1)、任何系统都必须去登陆服务器进行登录

2)、服务器就记住了登录状态

3)、其他系统访问受保护资源,需要再次登录,跳转到sso_server登录的时候,服务器告诉客户端,已经登录过,无须登录。登录过得信息

我这里用的框架是xxl-sso

单点登录的核心:

浏览器向服务器发送请求的过程:

首先浏览器向服务器发送请求,服务器判断是否登录,如果没有登录,则会把该请求重定向到sso-server去进行登录,认证中心判断是否登录过,如果没有登录,则会返回一个登录页,假如在登录页输入账号密码登录后,会提交账号密码到sso-server认证中心,然后sso-server回去数据库查询该用户的状态,但是由于分布式系统下session用不了,所以这里选择了存储在redis中。登录成功后会给浏览器响应头。响应头里有location(代表浏览器跳转到指定位置),还有set-Cookie(让浏览器保存一个cookie),也就是命令浏览器做上面的两件事,即跳转到指定位置,并且保存一个Cookie。Cookie保存在sso-server域名下。跳转的指定位置就是最初想要访问的那个url。并且当前网页也保存着这个cookie,也就是上面说的给自己也存一份。这个cookie没有存储在sso-server域名下,而是直接存储在当前域名下。这样的话以后浏览器访问当前url都会带上这个cookie,然后直接在client1去redis中通过这个cookie去查询用户信息。

第一次登录的关键:

1)认证中心拿到账户密码,查到用户,把用户保存到redis中,通过key保存

2)认证中心把这个key也保存在自己的域名对应的Cookie中

3)把这个key发送给原来本来要去的那个网页,保存在它的域名下,也就是自己也保存一份

最终结果是client域名和sso-server域名下都会有一个同名同值的域名。

总的来说就是下面这张图:

那么单点登录就是想做到一次登录,其他地方就不用再重复登录了,它是怎么做到的呢?也就是第二次登录是怎么做到不用再去登录中心登录的?

这就是单点登录的核心:

具体是代码实现:

我这里新创建了一个模块,client1.

首先是配置文件:

也就是第一次登录,假如发现没有携带Cookie的话,就会自动重定向到注册中心,也就是ssoserver.com:8082

这是代码:

判断的逻辑是这样的,首先会判断ssoUserParm是否为空, 如果不先判断这个的话,后面可能会陷入无限重定向,也就是说就是你第一次登录重定向到了登录中心,登录中心确认了你的登录,并且把生成的Cookie放在了登录中心的域名的浏览器下,并且给目标页的url放了这个cookie,但是你没有取出来用的话,那么登录中心重定向回来,当前页发现你依然没带Cookie,又会让你重定向到登录中心。所以,为了避免这个问题,首先要判断ssoUserParm的是否有了,而这个在你通过登录中心的验证后就会传递给你:

token就是ssouser

这里又把sso_user的数据放进了ssoUserParm中。

假如没有登录的话,就正式进入到登录中心的重定向:

当这些步骤做完后,目标url也保存了一个Cookie,所以以后就不用去登录中心了

那么如果把浏览器的Cookie禁用了怎么办?

所以这个项目并没有用到单点登录,而是直接通过token验证的,当登录成功时会创建一个token,并把token保存在redis中,然后将token返回给用户,以后用户要访问页面,只要带上这个token就行了(就jwt实现 token)

发布了208 篇原创文章 · 获赞 0 · 访问量 5988

猜你喜欢

转载自blog.csdn.net/qq_40058686/article/details/104583839