前言

公司的各种运维平台越来越多,用户再每个平台都注册账号,密码,密码太多记不住不说,然后有的平台过一段时间还得修改密码,烦!
还不如弄个统一登录平台!!

需求分析

造这辆大车,首先就得造两个轮子
首先,联想到实现方式一-----共享session:大致说的就是把cookie 跨域,然后同域的去拿这个cookie找服务端的session,
如果session 是有效,那么就登录成功,当然,服务端的session 也得共享一下,而且格式还得保持统一。
这样不好不好,刚有这个想法,就被后面的大傻个安全给否了,说那你的一个站瘫痪了,其他的不就玩完了。
接着实现方式二:大致就是子系统登录时,把要访问的地址信息啥的通过加密后的token,作为参数去请求统一登录,
然后统一登录解密token发现里面包含的信息啥的是对的,登录成功后,然后就把用户的信息和其他的一些玩意返回给子系统,子系统直接login就ok了。
这种方式感觉可搞,后面的大傻个也挑不出毛病。 最后终于找到了这俩轮子:
django-sso-simple
django-auth-ldap

需求实现

集成ladp登录

# 新建一个django项目,安装两个轮子,创建一个app

# 配置settings
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'django_auth_ldap.backend.LDAPBackend',
)
#在认证后端要加上ldap认证,当然加前加都可以,用户认证的时候是会按照顺序认证的,认证成功就返回,如果都失败了,那么就失败了。 import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, PosixGroupType, LDAPGroupQuery
# 这些意思就是配置ldap基础信息,同步那些用户信息到django的user里去。
AUTH_LDAP_SERVER_URI = "ldap://xxx.com:389"
AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,ou=People,dc=xxx,dc=com,dc=cn"
AUTH_LDAP_USER_ATTR_MAP = {
"username": "uid", "first_name": "cn",
}
AUTH_LDAP_ALWAYS_UPDATE_USER = True # posixGroup
# 下面是同步用户组到django的用户组中去。
AUTH_LDAP_GROUP_SEARCH = LDAPSearch('ou=group,dc=xxx,dc=com,dc=cn', ldap.SCOPE_SUBTREE,"(objectClass=posixGroup)")
# 这个type 很重要,各位看客注意自己的ldap 组是什么类型
AUTH_LDAP_GROUP_TYPE = PosixGroupType() # 同步ldap的用户组到用户信息里去,比如dev 或者研发组的 用户就是激活的.
AUTH_LDAP_FIND_GROUP_PERMS = True
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
"is_active":
LDAPGroupQuery("cn=dev,ou=group,dc=xxx,dc=com,dc=cn") |
LDAPGroupQuery("cn=ops,ou=group,dc=xxx,dc=com,dc=cn") "is_staff": "cn=ops,ou=group,dc=xxx,dc=com,dc=cn",
"is_superuser": "cn=admin,ou=group,dc=xxx,dc=com,dc=cn"
}
AUTH_LDAP_CACHE_GROUPS = True
AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600
AUTH_LDAP_MIRROR_GROUPS = True # 以上配置完成之后可以接入ldap验证一下。
# 如果有问题的直接看django-ldap-auth 文档就好啦。

sso实现

# django的登录,还是那个登录
def sso_login(request):
"""
登录成功后要设置用户信息到session 中去 。
"""
if request.method == 'GET':
if request.user.is_authenticated:
return HttpResponseRedirect(redirect_url)
return render(request, 'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password')
next_url = request.GET.get('next', None)
user = authenticate(username=username, password=password)
if user:
ret = login(request, user)
if not next_url:
return HttpResponseRedirect(redirect_url)
else:
return HttpResponseRedirect(next_url)
else:
error_message = '用户名或密码错误'
return render(request, 'login.html', locals())

url路由部分

# server 比较关键
sso_server = SSOServer()
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^success/', success,name="success"),
url(r'^logout/', sso_logout,name="logout"),
url(r'^ssologin', sso_login,name="ssologin"),
url(r'^server/', include(sso_server.get_urls())),
url(r'^$', sso_login,name="ssologin"),
]

源码分析

认证流程

流程文字版

1.客户端访问某个需要登录的地方,到了login_view这里,会把要访问的地址信息放到 redirect_to中去
2.然后把redirect_to 当做参数 去服务端request-token,请求一下token,服务端会返回一个token的request_token 。
3.然后带着这个token去访问authorize,登录成功后 服务端去验证token并检测这个用户是否有效。
4.然后客户端带着access_token 去获取用户信息,获取之后再登录。

流程图解

django实现SSO的更多相关文章

  1. [原创]django+ldap+memcache实现单点登录+统一认证

    前言 由于公司内部的系统越来越多,为了方便用户使用,通过django进行了单点登录和统一认证的尝试,目前实现了django项目的单点登录和非django项目的统一认证,中间波折挺多,涉及的技术包括dj ...

  2. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  3. [原创]django+ldap实现统一认证部分二(python-ldap实践)

    前言 接上篇文章 [原创]django+ldap实现统一认证部分一(django-auth-ldap实践) 继续实现我们的统一认证 python-ldap 我在sso项目的backend/lib/co ...

  4. [原创]django+ldap实现统一认证部分一(django-auth-ldap实践)

    前言 接之前我的文章,django+ldap+memcache实现单点登录+统一认证 ,ldap部署相关,ldap双机\LAM配置管理\ldap备份还原,目前来说,我们已经有了高可用性的ldap环境了 ...

  5. 玩儿了一下django User authentication

    五一在家,VPN不能链接了,而项目在本地run的过程中,又需要链接公司的SSO server才能login.下雨,不想去公司,又不得不在家做task,只能想办法避开SSO login,以前知道djan ...

  6. django session

    上周一个新的应用场景,带出来了关于django session管理的问题. 公司的另一个App以Widget的形式嵌入我们的页面,就是我们提供一些url,另一个App通过iframe的形式嵌入这些ur ...

  7. JWTtoken的原理以及在django中的应用

    JWT 在用户注册或者登陆完成之后,记录用户状态,或者为用户创建身份凭证(功能类似于session的作用). 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而 ...

  8. 6 Django REST framework JWT 和登录功能实现

    JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证. 我们不再使用Session认证机制,而使用Json Web Token认证机制. Json web token ( ...

  9. django drf框架中的user验证以及JWT拓展的介绍

    登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...

随机推荐

  1. [SDOI2017]苹果树

    题目描述 https://www.luogu.org/problemnew/show/P3780 题解 一道思路巧妙的背包题. 对于那个奇怪的限制,我们对此稍加分析就可以发现它最后选择的区域是一个包含 ...

  2. Grains 与 Pillars

    Grains 与 Pillars Grains介绍 Grains接口是salt用来采集底层系统信息的,包含了操作系统信息.域名.IP地址.内核.内存等一些底层信息.就是因为grains采集了这些信息, ...

  3. jmeter 多个sql写在一个jdbc请求中注意事项

    在url里面加上?allowMultiQueries=true 类型选callableStatement

  4. vue md5

    安装 cnpm install js-md5 --save 使用 import md5 from 'js-md5' md5('要加密的内容')

  5. Java调用第三方http接口的方式

    1. 概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适.很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信.天气等). 在J ...

  6. 第一节:EF Core简介和CodeFirst和DBFirst两种映射模式(以SQLite和SQLServer为例)

    一. EF简介 1. 定义 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台的数据访问技术,它还是一种对象关系映射器(ORM),它使.NET 开发人员能够使用面向对 ...

  7. Ps 应用小技巧总结

    一.如何等比例放大图片? 使用形状工具,画图之后,保存为智能对象,但是 ctrl+T 之后放大,会有虚边: 解决办法:编辑智能对象,在新的画布中:图像---图像大小----ctrl+alt+I 此处进 ...

  8. vue的计算属性与方法的不同

    计算属性 vue的模板里可以使用表达式,但是它的设计初衷是用于简单计算,在模板中放入太多逻辑会让模板过重且难以维护.例如: <div id="example"> {{ ...

  9. 初次接触scrapy框架

    初次接触这个框架,先订个小目标,抓取QQ首页,然后存入记事本. 安装框架(http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html) ...

  10. Codeforces Round #542 (Div. 1) 题解

    开学了住校了打不了深夜场 好难受啊QwQ A 显然对于每个起点,我们只需要贪心记录这个起点出发出去的糖果数量以及离自己最近的糖果 因为这个起点最后一次装载糖果一定是装载终点离自己最近的那个糖果 $ O ...