Django学习开发:使用openldap实现账号的统一管理

2023-06-0516:53:32后端程序开发Comments1,018 views字数 4284阅读模式

学习基于ldap的账号 登录Django开发的运维系统,为后续 基于ldap 实现 企业内部系统账号统一管理 打基础文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

了解和安装 ldap

ldap介绍

LDAP(Lightweight Directory Access Protocol)是一种轻量级的目录访问协议,它用于访问和维护分布式目录服务。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

LDAP最初设计用于提供对X.500目录服务的简化访问,后来被广泛应用于各种应用程序和系统中,包括身份验证、授权、用户管理和资源管理等。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

LDAP在许多企业和组织中被广泛应用于身份管理、用户认证、权限控制、电子邮件系统、VPN访问、公钥基础设施(PKI)等方面。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

它提供了一种有效的方式来组织和管理大量的目录数据,并提供对这些数据的可靠和高效访问。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

ldap安装

对于ldap的安装 可以通过官网提供的压缩包和采用docker的方式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

docker安装相对简单,而且一般可以采用 docker-compose 同时安装和管理ldap的管理界面,推荐搭配的是 phpldapadmin文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

下面是docker-compose.yml的内容文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

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 的用法与区别。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

关于这个可以详见 xxxx文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

启动和登录ldap

第一次使用 docker-composer 启动时,建议直接 docker-compose up 不加 -d 参数,这样启动过程有什么问题,可以直接在命令行看到文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

登录地址是当前主机节点加8080端口文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

注意? 登录的账号是 cn=admin,dc=colinspace,dc=com 而不是直接 admin文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

django 继承 ldap

在Django中使用ldap ,需要安装模块 django-python3-ldap文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

实验中用的各软件版本为文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

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

新增 Django测试项目,然后在项目的settings.py 中进行配置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

# 新增项目
django-admin startproject dj_ldap

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

修改 dj_ldap/settings.py 添加如下配置文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

# 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",
}

然后初始化项目和启动服务文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

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

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

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

然后使用超级管理员登录Django后台,看到user中只有一个 admin 超级管理员账号文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

然后在ldap 控制台新增一个 default类型 的用户,配置用户的 cn、sn、givenanme、邮箱文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

创建Ldap default user

具体参考如下截图文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

第一步文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

Django学习开发:使用openldap实现账号的统一管理
ldap-create-user-01

第二步文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

Django学习开发:使用openldap实现账号的统一管理
ldap-create-user-02

第三步文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

Django学习开发:使用openldap实现账号的统一管理
ldap-create-user-03

注意这里文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

1、RDN选择 cn文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

2、cn就是我们登录的用户名文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

3、下来选择配置 邮箱、密码等文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

使用 ldap user登录Django后台

第一次使用Ldap账号登录Django后台时会有报错如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

Django学习开发:使用openldap实现账号的统一管理
ldap-user-login-to-django-error

使用Ldap账号登录第一次Django后台时,Django默认会在后台新增一个用户,但是新增的用户不是staff ,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

可以通过下图确认文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

Django学习开发:使用openldap实现账号的统一管理
ldap-user-login-to-django

修改Django后台这个用户,让其成为staff 然后再次登录即可成功, 如下图所示文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

Django学习开发:使用openldap实现账号的统一管理
ldap-user-login-to-django

接入优化

上面提到第一次使用Ldap账号登录Django后台时,会报错提示不是staff。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

熟悉Django的朋友们都知道Django有很多内置的信号机制, 比如 post_save 就是在post提交数据之后触发的信号机制。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

针对上面的问题,我们知道是有个创建用户的事件发生的。那么我们就可以使用post_save 信号来实现创建用户之后更新 staff 从而实现一次性成功登录文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

1、在 appdemo 应用下新增 singals.py文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

# 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加载信号文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

# 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,发现就可以一次性成功,而没有报错了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

具体大家可以按照上面的流程尝试走一遍。加深理解。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

来源:全栈运维文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/44922.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/44922.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定