首先,什么是Ldap,官方解释
轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过ip协议提供访问控制和维护分布式信息的目录信息。
ldap能做什么?为什么要用ldap
LDAP的一个常用用途是单点登录,用户可以在多个服务中使用同一个密码,通常用于公司内部网站的登录中(这样他们可以在公司计算机上登录一次,便可以自动在公司内部网上登录)。
话不多说,上代码解释
# settings.py import ldap from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, PosixGroupType try: import ConfigParser as conf except ImportError as e: import configparser as conf config = conf.ConfigParser() config.read(os.path.join(BASE_DIR, 'conf/config.ini')) if config.get('ldap', 'enable') == 'true': ldap_filter = config.get('ldap', 'filter') if ldap_filter == "OpenLDAP": ldap_filter = '(cn=%(user)s)' else: ldap_filter = '(sAMAccountName=%(user)s)' AUTHENTICATION_BACKENDS = ( 'django_auth_ldap.backend.LDAPBackend', # 首先通过ldap认证,认证不通过走登录接口验证,ldap用户第一次登录,检测到数据库没有该用户,会自动创建一份用户信息到对应user表 'django.contrib.auth.backends.ModelBackend', ) AUTH_LDAP_SERVER_URI = "ldap://{server}:{port}".format(server=config.get('ldap', 'server'),port=config.get('ldap', 'port')) AUTH_LDAP_BIND_DN = "{bind_dn}".format(bind_dn=config.get('ldap', 'bind_dn')) AUTH_LDAP_BIND_PASSWORD = "{password}".format(password=config.get('ldap', 'bind_password')) AUTH_LDAP_USER_SEARCH = LDAPSearch("{search_dn}".format(search_dn=config.get('ldap', 'search_dn')), ldap.SCOPE_SUBTREE, ldap_filter) AUTH_LDAP_GROUP_TYPE = PosixGroupType(name_attr='cn') AUTH_LDAP_USER_ATTR_MAP = { "first_name": "givenName", "last_name": "sn", "email": "mail" } AUTH_LDAP_ALWAYS_UPDATE_USER = True if config.get('inception', 'enable') == 'true': INCEPTION_CONFIG = { "host":config.get('inception', 'host'), "port":config.get('inception', 'port'), "backup_host":config.get('inception', 'backup_host'), "backup_passwd":config.get('inception', 'backup_passwd'), "backup_user":config.get('inception', 'backup_user'), "backup_port":config.get('inception', 'backup_port') }
# config.ini [ldap] enable = true server = xxx.xxx.xxx.xxx # ldap服务器ip port = 389 # 端口默认389 bind_dn = cn=账号,dc=域名,dc=域名 # 账号必须是ldap管理员账号 bind_password = 密码 # 这些都问公司运维部门要 search_dn = ou=People,dc=域名,dc=域名 filter = OpenLDAP
view.py
用户表可以直接重写django-admin自带的user表,其内置了auth的验证方法
from django.contrib import auth # 登录 def login(request): if request.session.get('username') is not None: return HttpResponseRedirect('/',{"user":request.user}) else: username = request.POST.get('username') password = request.POST.get('password') user = auth.authenticate(username=username,password=password) # 认证方法,验证用户名密码都正确返回该用户对象 if user and user.is_active: auth.login(request,user) request.session['username'] = username return HttpResponseRedirect('/',{"user":request.user}) else: if request.method == "POST": return render(request,'login.html',{"login_error_info":"用户名或者密码错误","username":username},) else: return render(request,'login.html') # 退出登录 def logout(request): auth.logout(request) # 登出,清楚session return HttpResponseRedirect('/login')
创建auth_user中的用户通过
python manage.py create superuser