django-auth-ldap 简明使用笔记
前言
django-auth-ldap能够为Django提供LDAP登录支持。只需要少量配置,无需改变Django的认证逻辑。对已有项目侵入性很小,使用起来非常方便。
本篇为大家带来使用django-auth-ldap的安装和使用方式。
环境依赖安装
环境信息:
- Fedora 40
- Python 3.12.7
在Linux系统安装如下依赖:
- gcc
- python-devel
- openldap-devel
然后创建Python虚拟环境和初始化Django项目:
python -m venv django-demo-project
cd django-demo-project
source bin/activate
pip install Django -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install django-auth-ldap -i https://pypi.tuna.tsinghua.edu.cn/simple/
django-admin startproject mysite
Django-auth-ldap配置
修改项目的settings.py
,增加:
AUTHENTICATION_BACKENDS = ["django_auth_ldap.backend.LDAPBackend"]
然后增加LDAP相关配置:
import ldap
from django_auth_ldap.config import LDAPSearch
# LDAP服务地址
AUTH_LDAP_SERVER_URI = "ldap://ldap_ip:389"
# LDAP bind dn和密码
AUTH_LDAP_BIND_DN = "cn=manager,dc=paultech,dc=com"
AUTH_LDAP_BIND_PASSWORD = "123456"
# 告诉Django如何根据用户名找到用户的DN
AUTH_LDAP_USER_SEARCH = LDAPSearch(
"dc=paultech,dc=com", ldap.SCOPE_SUBTREE, "(uid=%(user)s)"
)
编写演示页面。新建views.py
增加如下内容:
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
def index(request):
username = request.GET["username"]
password = request.GET["password"]
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return HttpResponse("Hello, world. You're logged in.")
else:
return HttpResponse(f"Login failed. Username: {username}, password: {password}")
然后修改urls.py
:
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('demo/', views.index, name="demo")
]
到此为止LDAP已经配置完毕。接着开始验证前面的配置是否正确。使用如下命令启动Django server:
cd manage.py所在路径
python manage.py runserver 0.0.0.0:8080
然后浏览器地址栏输入如下URL:
http://ip:8080/demo/?username=admin&password=correctPassword
其中username和password为正确的密码。可以看到浏览器返回Hello, world. You're logged in.
。说明用户成功登录。
接下来试验登录失败的场景。浏览器输入http://ip:8080/demo/?username=admin&password=wrongPassword
浏览器返回Login failed. Username: admin, password: wrongPassword
,登录失败。
自定义LDAPBackend
我们可以通过继承框架提供的LDAPBackend类,重写其authenticate_ldap_user
方法,实现自定义的认证逻辑。
例如我们存入LDAP服务中的用户密码使用plain text,在保存之前使用了base64处理。在Django中为了能够正常登录,需要在登录之前,将用户输入的password同样使用base64处理才行。示例代码如下:
from django_auth_ldap.backend import LDAPBackend
import base64
class CustomLDAPBackend(LDAPBackend):
def authenticate_ldap_user(self, ldap_user, password):
base64password = base64.b64encode(password.encode("utf-8")).decode("utf-8")
user = ldap_user.authenticate(base64password)
return user
然后修改settings.py
中的AUTHENTICATION_BACKENDS
为我们自定义的LDAPBackend,例如:
AUTHENTICATION_BACKENDS = ["mysite.custom_ldap_backend.CustomLDAPBackend"]
即可生效。
参考文献
https://django-auth-ldap.readthedocs.io/en/latest/install.html
https://django-auth-ldap.readthedocs.io/en/latest/custombehavior.html