前言
公司的各种运维平台越来越多,用户再每个平台都注册账号,密码,密码太多记不住不说,然后有的平台过一段时间还得修改密码,烦!
还不如弄个统一登录平台!!
需求分析
造这辆大车,首先就得造两个轮子
首先,联想到实现方式一-----共享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 文档就好啦。
View Code