在django中进行ldap登录验证并不复杂,只需要在settings.py中进行一些配置即可。
pip install ldap
pip install django-auth-ldap
import ldap
from django_auth_ladp.config import LDAPSearch,GroupOfNamesType
添加:
AUTHENTICATION_BACKENDS = (
"django_auth_ladp.backend.LDAPBackend", ##配置为先使用LDAP认证,如通过认证则不再使用后面的认证方式
"django.contrib.auth.backends.ModelBackend",
)
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": "givenName",AUTH_LDAP_ALWAYS_UPDATE_USER = True ##是否同步LDAP修改
(1)首先获取输入的用户名name和密码password.通过类似request.POST.get("username")获取。"username"是前端标签属性name的值。
(2)使用django内置的authenticate进行验证。
from django.crontrib.auth import authenticate,login as auth_login
user = authenticate(username=name,password=password)
因为前面已经配置过ldap,所以这里会去与ldap的账户进行验证。
如果用户名或者密码错误,直接返回None.
(3)验证完成后,使用django的登录函数进行登录。
auth_login(request, user)
这里说明,ldap登录采用了django内置的登录函数。登录的账户信息会存在auth_user表中,session会存在django_session表中(session默认的过期时间是2周)。值得注意的是,ldap登录的信息虽然也写在auth_user这张表中,但它所对应的password并非是对密码的记录。可能只是对每个帐号首次登录随机生成的一串数字,目前并没有去研究具体是什么。
(4)关于session部分可以有以下几种处理方式:
a.写退出逻辑的时候,清除django_session表中的session. 使用request.session.flush().
b.在setting中进行设置:
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
SESSION_COOKIE_AGE = 60*30 ##session过期时间
SESSION_EXPIRE_AT_BROWSER_CLOSE = True ##浏览器关闭,session失效