Django中使用openldap实现账号的统一管理

news2024/12/19 23:22:50

了解和安装 ldap

ldap介绍

LDAP(Lightweight Directory Access Protocol)是一种轻量级的目录访问协议,它用于访问和维护分布式目录服务。

LDAP最初设计用于提供对X.500目录服务的简化访问,后来被广泛应用于各种应用程序和系统中,包括身份验证、授权、用户管理和资源管理等。

LDAP在许多企业和组织中被广泛应用于身份管理、用户认证、权限控制、电子邮件系统、VPN访问、公钥基础设施(PKI)等方面。

它提供了一种有效的方式来组织和管理大量的目录数据,并提供对这些数据的可靠和高效访问。

ldap安装

对于ldap的安装 可以通过官网提供的压缩包和采用docker的方式

docker安装相对简单,而且一般可以采用 docker-compose 同时安装和管理ldap的管理界面,推荐搭配的是 phpldapadmin

下面是docker-compose.yml的内容

version: '3'

services:
  openldap:
    # 容器的名称,确保唯一性,用户命令行管理
    # 同时如果多个容器关联时,使用的也是这个名称
    container_name: openldap
    # 容器镜像
    image: osixia/openldap:latest
    # 重启方案
    restart: always
    # 定义容器中的环境变量
    # 这里主要是为了在安装初始化ldap的时候,初始化ldap的 组织、域名和密码
    # 注意: 默认的admin账号是 cn=admin,dc=colinspace,dc=com
    environment:
      LDAP_ORGANISATION: "colinspace"
      LDAP_DOMAIN: "colinspace.com"
      LDAP_ADMIN_PASSWORD: "ldapinitpass99"
      LDAP_CONFIG_PASSWORD: "ldapinitpass99"
    # ldap端口映射
    # 389 ldap协议普通端口;636 ldap协议安全端口 secure port
    # 注意这里映射到外面的端口,后续再Django中获取其他可以对接ldap的系统中要使用
    ports:
      - "8389:389"
      - "8636:636"
  # 定义第二个service, phpldapadmin
  phpldapadmin:
    container_name: phpldapadmin
    image: osixia/phpldapadmin:latest
    ports:
      - "8080:80"
    environment:
      - PHPLDAPADMIN_HTTPS="false"
      - PHPLDAPADMIN_LDAP_HOSTS=openldap
    links:
      - openldap
    depends_on:
      - openldap

上面配置文件中还有个关键的说明就是 links 和 depends_on 的用法与区别。

关于这个可以详见 xxxx

启动和登录ldap

第一次使用 docker-composer 启动时,建议直接 docker-compose up 不加 -d 参数,这样启动过程有什么问题,可以直接在命令行看到

登录地址是当前主机节点加8080端口

注意📢 登录的账号是 cn=admin,dc=colinspace,dc=com 而不是直接 admin

django 继承 ldap

在Django中使用ldap ,需要安装模块 django-python3-ldap

实验中用的各软件版本为

  • Django == 4.0.6
  • Python == 3.9.6
pip install django-python3-ldap

新增 Django测试项目,然后在项目的settings.py 中进行配置

# 新增项目
django-admin startproject dj_ldap

# 新增 app
cd dj_ldap
python manage.py startapp appdemo

修改 dj_ldap/settings.py 添加如下配置

# ldap 协议的地址,主要端口是docker容器映射出来的具体端口
LDAP_AUTH_URL = "ldap://192.168.3.4:8389"
# 关闭 secure port
LDAP_AUTH_USE_TLS = False

# 认证时搜索的dc 域
LDAP_AUTH_SEARCH_BASE = "dc=colinspace,dc=com"
# 认证时对象的objectClass, 配置了 inetOrgPerson ,那么只有 object class 是 inetOrgPerson类型的用户才可以登录Django
LDAP_AUTH_OBJECT_CLASS = "inetOrgPerson"

# 认证时的字段对应关系
# Django字段 -> ldap 字段
LDAP_AUTH_USER_FIELDS = {
    "username": "cn",
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail",
}
# 认证时使用Django用户字段
LDAP_AUTH_USER_LOOKUP_FIELDS = ("username", )
# clean_user_data 类型
LDAP_AUTH_CLEAN_USER_DATA = "django_python3_ldap.utils.clean_user_data"
# ldap的管理员账号和密码
LDAP_AUTH_CONNECTION_USERNAME = "admin"
LDAP_AUTH_CONNECTION_PASSWORD = "Kongfz#LdA99p"
# Django认证方式,支持ldap和Django本身的 ModelBackend
AUTHENTICATION_BACKENDS = {
    "django_python3_ldap.auth.LDAPBackend",
    "django.contrib.auth.backends.ModelBackend",
}

然后初始化项目和启动服务

# 先同步数据库结构
python manage.py makemigration
python manage.py migrate 

# 根据提示创建一个超级管理员及其密码
python manage.py createsuperuser 

# 启动服务
python manage.py runserver 0.0.0.0:8001

然后使用超级管理员登录Django后台,看到user中只有一个 admin 超级管理员账号

然后在ldap 控制台新增一个 default类型 的用户,配置用户的 cn、sn、givenanme、邮箱

创建Ldap default user

具体参考如下截图

第一步

ldap-create-user-01

第二步

ldap-create-user-02

第三步

ldap-create-user-03

注意这里

1、RDN选择 cn

2、cn就是我们登录的用户名

3、下来选择配置 邮箱、密码等

使用 ldap user登录Django后台

第一次使用Ldap账号登录Django后台时会有报错如下:

ldap-user-login-to-django-error

使用Ldap账号登录第一次Django后台时,Django默认会在后台新增一个用户,但是新增的用户不是staff

可以通过下图确认

ldap-user-login-to-django

修改Django后台这个用户,让其成为staff 然后再次登录即可成功, 如下图所示

ldap-user-login-to-django

接入优化

上面提到第一次使用Ldap账号登录Django后台时,会报错提示不是staff。

熟悉Django的朋友们都知道Django有很多内置的信号机制, 比如 post_save 就是在post提交数据之后触发的信号机制。

针对上面的问题,我们知道是有个创建用户的事件发生的。那么我们就可以使用post_save 信号来实现创建用户之后更新 staff 从而实现一次性成功登录

1、在 appdemo 应用下新增 singals.py

# appdemo/signals.py
#!/usr/bin/env python
# encoding: utf-8

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=User)
def update_staff(sender, instance, created, **kwargs):
    if created:
        print(f"create new instance: {instance}")
        instance.is_staff = True
        instance.save()

2、在appdemo应用的apps.py加载信号

# appdemo/apps.py
from django.apps import AppConfig


class AppdemoConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'appdemo'

    # 新增如下两行配置
    def ready(self):
        import appdemo.signals

3、重启Django应用之后,再在ldap新增一个新用户然后登录Django,发现就可以一次性成功,而没有报错了。

具体大家可以按照上面的流程尝试走一遍。加深理解


如果觉得文章对你有用,请不吝点赞 和 关注个人公众号(搜索 全栈运维 或者 DailyJobOps

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot源码分析:SpringBoot整合Tomcat(三)

一、概述 SpringBoot整合Tomcat整体启动流程如下图,接下来我们就按照改流程分析SpringBoot中内嵌Tomcat的启动流程。 二、启动流程 通过AbstractApplicationContext.refresh方法进入AbstractApplicationContext.onRefresh方法。 之后进入子类ServletWebServerAppl…

Word控件Spire.Doc 【其他】教程(6):从 Word 中提取 OLE 对象

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

chatgpt赋能python:Python后退命令:如何让你的程序退回到之前的状态

Python后退命令:如何让你的程序退回到之前的状态 Python是一种高级编程语言,因其易读易懂而闻名于世。Python中有很多命令用于编写程序,其中一项重要的命令是后退命令。本文将介绍Python后退命令的使用方法,并为您提供详细的步骤…

ChatGPT热度不减!华为宣布入局,盘古GPT能否大杀四方!

ChatGPT热度不减 六月份了,朋友们,来到六月份了已经,ChatGPT的热度依旧不减,各大论坛网站的榜单上还飘着ChatGPT相关话题的文章,且排名靠前。由此可见,这ChatGPT这股子热潮还得持续一段时间呢。 而且ChatG…

cuda block grid等介绍

这里写目录标题 cuda层次结构程序架构层次结构cuda程序调用cuda 内置变量GPU内存模型内存结构 可编程内存内存作用域寄存器本地内存共享内存共享内存访问冲突常量内存全局内存gpu缓存 cuda层次结构 程序架构 申请内存时是线性的内存,需要知道是按行还是按列排列 设计…

【Linux】Linux内核编译与入门

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Linux内核编译。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&am…

DM数据库TEXT类型字段查询返回时的问题

一、问题描述: 在项目中使用到了DM数据库连接,查询某些数据,然后以Map形式返回时TEXT类型是会出现一些问题,默认会转换为dm.jdbc.driver.DmdbNClob类型的对象,某些情况下(不知道具体原因)在JSON…

移动端布局之flex布局1:flex布局体验、flex布局原理、flex布局父项常见属性

移动端布局之flex布局1 flex布局体验传统布局和flex弹性布局的区别初体验index.html flex布局原理布局原理 flex布局父项常见属性常见父项属性flex-direction设置主轴的方向(重要)主轴与侧轴属性值flex-direction: row;flex-direction: row-reverse;flex…

笔试强训9

作者:爱塔居 专栏:笔试强训 文章简介:简单记录学习的细碎~ day15 一. 单选 1.给出数据表 score(stu-id,name,math,english,Chinese), 下列语句正确的是( ) A Select sum(math),avg(chinese) from score B Select *,s…

麒麟V10防火墙,VNC,YUM源, nfs ,磁盘格式化

麒麟V10防火墙,VNC,YUM源, nfs ,磁盘格式化 麒麟V10开启防火墙并设置开机自启 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁…

2023年Q1电商平台饮料行业数据分析报告

我国的饮料市场非常庞大,从碳酸饮料到茶饮料,从功能性饮料到水,各个品类都有广泛的消费者基础。加之如今饮料消费场景不断延伸,家庭囤货、户外即饮、运动健身等成为消费者饮料需求的新场景,新需求带动线上饮料市场持续…

Numpy---创建多维数组、创建正态分布、创建均匀分布

1. 创建一个随机整数的多维数组 np.random.randint(low, highNone, sizeNone, dtypel) 参数说明: low : 最小值 highNone: 最大值 highNone时,生成的数值在【0, low)区间内 如果使用high这个值,则生成的数值在【low, high)区…

Nginx服务——主配置文件-nginx.conf

一、全局配置的6个模块简介 模块说明全局块全局配置,对全局生效events块配置影响 Nginx 服务器与用户的网络连接http块配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置server块配置虚拟主机的相关参数,一个 http 块中可…

SSD源码总结

一、生成默认框 默认框的宽高 默认框的宽高是相对于原图的尺寸计算出来的。 默认框的中心 默认框的中心是相对于特征图的尺寸计算出来的。 二、将真实框分配给默认框 1、区分正负样本 1.1、选取正样本 计算真实框(bboxs)与每个默认框(…

centos安装etcd

方法1:默认安装(不建议) 运行命令 yum install etcd 即可,只是安装的etcd版本较低,一般是 etcd-3.3.11,如下图 手动开启etcd,可以看到etcd服务已经开启来了,如下图 特别注意&#x…

Java开发手册中为什么要求谨慎使用ArrayList中的sublist方法

场景 Java开发手册中对于ArrayList的subList的要求如下: 【强制】ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常: java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。 说明&a…

Customizable constraint systems for succinct arguments学习笔记(2)

微软研究中心Srinath Setty、a16z crypto research 和 Georgetown University Justin Thaler、Carnegie Mellon University Riad Wahby 20203年论文《Customizable constraint systems for succinct arguments》。 前序博客有: Customizable constraint systems f…

别小瞧,搬迁网络机房,讲究的可不少

大家好,我的网工朋友 最近围观咱们网工交流群,不少朋友提到机房搬迁这档子事,毕竟嘛,做到这方面项目的概率还是很高的。 别看机房搬迁很简单,其实可讲究了。 随着企业、单位的不断深入发展,机房搬迁&…

【正点原子STM32连载】 第二十六章 USMART调试组件实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十…

记录搭建hadoop集群的过程

Linux(CentOS-7.6-x64位)基础配置, 虚拟机平台VmWare15 CentOS-7.6-x64镜像下载: https://www.aliyundrive.com/s/72Xg449t6i8 提取码: 32rm VmVare15安装包下载带序列号:VmVare15安装包下载带激活序列号资源-CSDN文库 点击关闭,点击完成&…