django 实现统一登录(未完待续)

django 实现统一登录

前言
公司的各种运维平台、工具越来越多,搞得用户需要记住不同平台不同的密码,当然,用户可以选择各个平台都使用一个密码,奈何我身后坐着一个超烦的安全,天天瞎搞。忍无可忍,终于要祭出大招。搞一把统一登录。


前期需求分析,及技术调研

其实就是看看能不能找到可以直接拿来抄的。 不要重复造轮子么。
找啊找啊找啊找。对比了不同统一登录的实现方式,或简单、或复杂。但是都不太适用。

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

最后找到两个轮子
django-sso-simple
django-auth-ldap

具体需求实现

论如何更好的组装轮子

  1. 集成ldap 登录
# 新建一个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 文档就好啦。
  1. 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 路由部分 需要include sso的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"),
]

以下其实就是django-sso

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值