美文网首页
django-auth-ldap 简明使用笔记

django-auth-ldap 简明使用笔记

作者: AlienPaul | 来源:发表于2024-12-16 13:52 被阅读0次

前言

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

相关文章

网友评论

      本文标题:django-auth-ldap 简明使用笔记

      本文链接:https://www.haomeiwen.com/subject/nbhkejtx.html