咨询电话:
15628812133
13
2021/03

Django实现单点登录(SSO)

发布时间:2021-03-13 10:32:19
发布者:已经写了
浏览量:
0

SSO简介

单点登录(Single Sign On)功能是一个非常常用的功能,尤其是我们在多个系统之间需要登录同步的时候,例如我们在登录QQ空间后,再去QQ的其他网站,都是默认登录的状态,这就是单点登录。

单点登录有很多种实现方法,这里介绍一个通过共享session的实现方法。实现共享session要做的就是要让多个不同应用共用同一个session,但是session默认的是每个应用一个独立的session和cookie的,所以这里要对session的存储进行配置。

除了默认的session存储,我也可以设置让session存储在文件、缓存或者数据库中。

如果我们让session存储在一个固定位置或者数据库中,然后我们设置各个应用cookie的domain为父域地址即可实现各个cookie的相同,从而时候各个cookie中存储的sessionID一致。

搭建测试环境

下面我们来创建两个空的Django项目来进行演示,SSO1和SSO2,这里采用pycharm直接创建两个Django项目,也可以在命令行中使用django-admin startproject sso来创建,其中sso是创建的项目名称。这里也可以使用两个完全相同的项目,在不同地址启动,但是为了演示效果,这里创建了2个。

Django实现单点登录

创建好两个项目后,我们要给项目写一个模拟的登录,注销的功能。

在templates文件夹下创建文件login.html文件。这里直接使用之前写过的登录页面的代码,样式就不加了,在SSO1和SSO2中都加入login.html,具体代码为:

然后在SSO1文件夹创建一个view.py文件,用来存放视图函数。

创建文件后的文件目录为:

插入一个小BUG

macbook运行环境,pycharm创建的Django应用有时候初始化有个bug,缺少os库,会报错:

Django实现单点登录

如果有这个报错的话,在setting.py中导入os即可:import os

然后我们在两个项目的view.py中写入登录和注销函数:

Django实现单点登录

在url.py中添加路由信息:

Django实现单点登录

Django默认配置了csrf,需要将它注释掉,在settings.py文件中搜csrf,然后注释掉。

然后分别为两个项目做数据库迁移,创建一些Django项目的基础库:

python3 manage.py migrate

两个项目都是同样的配置,这样我们目前两个测试的项目就搭建好了,然后我们分别启动他们在不同的端口。这里我们就直接手动启动了,分别启动在5000和6000端口。

python3 manage.py runserver 127.0.0.1:5000
python3 manage.py runserver 127.0.0.1:7000

启动两个项目:

Django实现单点登录

现在我们分别在浏览器中打开http://127.0.0.1:5000/login/和http://127.0.0.1:7000/login/,显示的页面都是登录页面,显示如下:

Django实现单点登录

这时我们在http://127.0.0.1:5000/login/随意输入账户密码点击登录,显示:

  • usr:username,password:123123,sessionid:None,cookie:{'csrftoken': '8YPasFGJUKDfsdH6kdFZzr9TkDtdVTKflgDDeIn0wgGC6cAeudcasdDSFEAIxX'}

此时我们进入http://127.0.0.1:7000/login/,发现这个应用中,显示的还是之前的页面,登录没有同步。下面我们来实现我们的SSO,这里的实现方法非常的简单:将session固定存储在同一个文件中,

Django实现单点登录

注意一下,这里配置的都是一样的,但是如果两个项目名称不一样的话,是不能直接将完整的settings.py直接复制到另一个的,因为里面有一些项目的配置,例如ROOT_URLCONF = 'SSO1.urls'、WSGI_APPLICATION = 'SSO1.wsgi.application'这些前面的都是项目名,需要主要区分。

此时我们在打开http://127.0.0.1:5000/login/,输入账号密码,此页面显示:

  • usr:123,password:123,sessionid:2bs2nx2iq879epxu7au7o1zq63o095v7,cookie:{'sessionid': '2bs2nx2iq879epxu7au7o1zq63o095v7', 'csrftoken': '8YPzJbY03sHJUZH6kdFZzr9TkDtdVTKflgDDeIn0wgGC6cAeudcrkXLyIxXBEnzG'

此时我们在打开http://127.0.0.1:7000/login/,我们直接访问,而不用登录,发现显示同样的内容,即我们使用的是同样的内容,实现了SSO。

返回列表