博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django实现SSO
阅读量:5254 次
发布时间:2019-06-14

本文共 3283 字,大约阅读时间需要 10 分钟。

 

前言

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

 

需求分析

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

 

需求实现

集成ladp登录

# 新建一个django项目,安装两个轮子,创建一个app# 配置settings AUTHENTICATION_BACKENDS = (    'django.contrib.auth.backends.ModelBackend',    'django_auth_ldap.backend.LDAPBackend',)#在认证后端要加上ldap认证,当然加前加都可以,用户认证的时候是会按照顺序认证的,认证成功就返回,如果都失败了,那么就失败了。 import ldapfrom 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 = TrueAUTH_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 = TrueAUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600AUTH_LDAP_MIRROR_GROUPS = True# 以上配置完成之后可以接入ldap验证一下。# 如果有问题的直接看django-ldap-auth 文档就好啦。
View Code

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())
View Code

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"),]
View Code

源码分析

认证流程

流程文字版

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

流程图解

 

转载于:https://www.cnblogs.com/djfboai/p/10671083.html

你可能感兴趣的文章
代理ARP
查看>>
go 学习笔记(4) ---项目结构
查看>>
java中静态代码块的用法 static用法详解
查看>>
Java线程面试题
查看>>
Paper Reading: Relation Networks for Object Detection
查看>>
day22 01 初识面向对象----简单的人狗大战小游戏
查看>>
mybatis源代码分析:深入了解mybatis延迟加载机制
查看>>
Flask三剑客
查看>>
Hibernate-缓存
查看>>
【BZOJ4516】生成魔咒(后缀自动机)
查看>>
提高PHP性能的10条建议
查看>>
svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法...
查看>>
熟用TableView
查看>>
Java大数——a^b + b^a
查看>>
poj 3164 最小树形图(朱刘算法)
查看>>
服务器内存泄露 , 重启后恢复问题解决方案
查看>>
android一些细节问题
查看>>
KDESVN中commit时出现containing working copy admin area is missing错误提示
查看>>
利用AOP写2PC框架(二)
查看>>
【动态规划】skiing
查看>>