在django中进行ldap登录验证并不复杂,只需要在settings.py中进行一些配置即可。
1.安装ldap库。
pip install ldap
pip install django-auth-ldap
2.在setting.py中导入
import ldap
from django_auth_ladp.config import LDAPSearch,GroupOfNamesType
添加:
AUTHENTICATION_BACKENDS = (
"django_auth_ladp.backend.LDAPBackend", ##配置为先使用LDAP认证,如通过认证则不再使用后面的认证方式
"django.contrib.auth.backends.ModelBackend",
)
3.在setting.py中配置ldap
AUTH_LDAP_SERVER_URI = "ldap://xx.x.x.xx:xxx" ##ladp的地址和端口号
AUTH_LDAP_BIND_DN = "cn=xxx, ou=xxx, dc=xxx, dc=xxx" ##绑定用户名
AUTH_LDAP_BIND_PASSWORD = "123456" ##这一句和上一句是绑定一个正在使用中的ldap用户名和密码
AUTH_LDAP_USER_SEARCH = LDAPSearch("dc=xxx,dc=xxx", ldap.SCOPE_SUBTREE, "(&(objectClass=person)(sAMAccountName=%(user)s))")
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": "givenName",
"last_name": "sn",
"email": "mail"
} #将账号的姓、名、邮件地址保存到django的auth_user表中,在admin后台可以看到,注意这里并没有绑定密码
AUTH_LDAP_ALWAYS_UPDATE_USER = True ##是否同步LDAP修改
4.以上步骤配置完成后,可以写登录页面(login.html)和登录的后台逻辑。这里讲一下后台的登录逻辑的写法。
(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失效