近期在练手Django,前期网站前后端已经搭建得差不多了。

后面打算加入LDAP进行后台数据库登录授权,使用的Django的admin界面。

Django的admin界面还是很开发友好的,省区了很多数据库展示开发的工作,可以搜索“Django二次开发”发现更多的内容。

LDAP知识

LDAP是一个协议,而开源的LDAP和微软的Active Directory都是支持这个协议的。

一般我们Windows会使用AD做域控,LDAP的一些基础概念可以看下如下文章:

LDAP 中 CN, OU, DC 的含义_ba_jie的博客-CSDN博客_ldap ou

了解了这些可以帮助我们配置各大服务的LDAP部分。

一、安装LDAP相关库

虽然很快就能搜到Django LDAP方案代码,但是我发现我为了装ldap相关库,竟然踩了些坑。总结一下,给有需要的同学。

方案:django中ldap验证的三种方式,你需要哪种?_Tian, Yuting的博客-CSDN博客_django ldap

准备参考这篇文章的时候,发现我的django_auth_ldap没有装,需要安装django-auth-ldap,使用pycharm安装时,由于是源码安装,总是报C++的问题。

解决方法:使用whl安装。

下载whl:

Python Extension Packages for Windows - Christoph Gohlke (uci.edu)

1. 先安装pyldap或python_ldap, 我安装的版本是python_ldap-3.4.0-cp37-cp37m-win_amd64.whl,将whl下载并放到Scripts目录下,cd **/Scripts后用pip安装:

C:\Users\XXX\PycharmProjects\djangoProject\venv\Scripts> pip install python_ldap-3.4.0-cp37-cp37m-win_amd64.whl
Processing c:\users\XXX\pycharmprojects\djangoproject\venv\scripts\python_ldap-3.4.0-cp37-cp37m-win_amd64.whl
Requirement already satisfied: pyasn1>=0.3.7 in c:\users\XXX\pycharmprojects\djangoproject\venv\lib\site-packages (from python-ldap==3.4.0) (0.4.8)Collecting pyasn1-modules>=0.1.5Using cached pyasn1_modules-0.2.8-py2.py3-none-any.whl (155 kB)
Installing collected packages: pyasn1-modules, python-ldap
Successfully installed pyasn1-modules-0.2.8 python-ldap-3.4.0

2. 安装:django-ahth-ldap

C:\Users\XXX\PycharmProjects\djangoProject\venv\Scripts> pip install django_auth_ldap-4.1.0-py30-none-any.whl

该安装包地址:https://www.wheelodex.org/projects/django-auth-ldap/wheels/django_auth_ldap-4.1.0-py3-none-any.whl/

下载地址:https://files.pythonhosted.org/packages/d1/34/e519840e68108c452d9ed559fb0ac091dcddf70db860c0d1c808d78c46fc/django_auth_ldap-4.1.0-py3-none-any.whl

注意我们下载下来的名称要改成本地python兼容tag名称:

输入:pip debug --verbose 查看兼容名称

参考文章:python 安装whl文件_ Marks的博客-CSDN博客_python手动安装whl

C:\Program Files\Python37\Scripts>pip debug --verbose
WARNING: This command is only meant for debugging. Do not use this with automation for parsing and getting these details, since the output and options of this command may change without notice.
pip version: pip 20.1.1 from c:\program files\python37\lib\site-packages\pip (python 3.7)
sys.version: 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)]
sys.executable: c:\program files\python37\python.exe
sys.getdefaultencoding: utf-8
sys.getfilesystemencoding: utf-8
locale.getpreferredencoding: cp936
sys.platform: win32
sys.implementation:name: cpython
'cert' config value: Not specified
REQUESTS_CA_BUNDLE: None
CURL_CA_BUNDLE: None
pip._vendor.certifi.where(): c:\program files\python37\lib\site-packages\pip\_vendor\certifi\cacert.pem
pip._vendor.DEBUNDLED: False
vendored library versions:appdirs==1.4.3CacheControl==0.12.6colorama==0.4.3contextlib2==0.6.0.post1 (Unable to locate actual module version, using vendor.txt specified version)distlib==0.3.0distro==1.5.0 (Unable to locate actual module version, using vendor.txt specified version)html5lib==1.0.1ipaddress==1.0.23msgpack==1.0.0 (Unable to locate actual module version, using vendor.txt specified version)packaging==20.3pep517==0.8.2progress==1.5pyparsing==2.4.7requests==2.23.0certifi==2020.04.05.1chardet==3.0.4idna==2.9urllib3==1.25.8resolvelib==0.3.0retrying==1.3.3 (Unable to locate actual module version, using vendor.txt specified version)setuptools==44.0.0 (Unable to locate actual module version, using vendor.txt specified version)six==1.14.0toml==0.10.0webencodings==0.5.1 (Unable to locate actual module version, using vendor.txt specified version)
Compatible tags: 27cp37-cp37m-win_amd64cp37-abi3-win_amd64cp37-none-win_amd64cp36-abi3-win_amd64cp35-abi3-win_amd64cp34-abi3-win_amd64cp33-abi3-win_amd64cp32-abi3-win_amd64py37-none-win_amd64py3-none-win_amd64py36-none-win_amd64py35-none-win_amd64py34-none-win_amd64py33-none-win_amd64py32-none-win_amd64py31-none-win_amd64py30-none-win_amd64cp37-none-anypy37-none-anypy3-none-anypy36-none-anypy35-none-anypy34-none-anypy33-none-anypy32-none-anypy31-none-anypy30-none-any

这样django-auth-ldap就安装好啦。

Linux上安装很简单:

  • 安装依赖库:

sudo yum install python-devel

sudo yum install openldap-devel

安装django-auth-ldap

pip install django-auth-ldap

二、LDAP授权功能调试

修改settings.py文件:

笔者参考的这篇文档:Django-auth-ldap 配置方法 - 云+社区 - 腾讯云

注意要加入一个超级用户的用户名和密码,参考文档:Authentication — django-auth-ldap 4.0.1.dev12+g6dfdec9.d20220510 documentation
​​​​​​​AUTH_LDAP_BIND_DN = ""
AUTH_LDAP_BIND_PASSWORD = ""

以下是我测试可用的代码:

#Django-auth-ldap 配置部分import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
#修改Django认证先走ldap,再走本地认证AUTHENTICATION_BACKENDS = ['django_auth_ldap.backend.LDAPBackend','django.contrib.auth.backends.ModelBackend',
]
#ldap的连接基础配置
AUTH_LDAP_SERVER_URI = "ldap://****:389"
AUTH_LDAP_BIND_DN = "***"
AUTH_LDAP_BIND_PASSWORD = "*****"
AUTH_LDAP_USER_SEARCH = LDAPSearch("OU=group1,DC=company,DC=com",ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)")
#通过组进行权限控制
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("OU=group2,OU=group1,DC=company,DC=com",ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)")
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
#is_staff:这个组里的成员可以登录;is_superuser:组成员是django admin的超级管理员;is_active:组成员可以登录django admin后台,但是无权限查看后台内容
AUTH_LDAP_USER_FLAGS_BY_GROUP = {"is_staff": "CN=group_account,OU=group2,OU=group1,DC=company,DC=com","is_superuser": "CN=group_account,OU=group2,OU=group1,DC=company,DC=com",
}#通过组进行权限控制end#如果ldap服务器是Windows的AD,需要配置上如下选项AUTH_LDAP_CONNECTION_OPTIONS = {ldap.OPT_DEBUG_LEVEL: 1,ldap.OPT_REFERRALS: 0,
}
#当ldap用户登录时,从ldap的用户属性对应写到django的user数据库,键为django的属性,值为ldap用户的属性AUTH_LDAP_USER_ATTR_MAP = {"first_name": "givenName","last_name": "sn","email": "mail"}

完成以上修改后,http://localhost/admin  界面就可以通过LDAP授权登录了。

凡是在LDAP群组里的用户均可登录该界面。但是我想要的是前端自己开发的界面也通过LDAP授权。

三、登录界面开发

Django开发有很多隐藏功能,但是好处是资料很多,在网上搜集了一番后,得出自己的前端开发程序。

首先,找一个好看的html页面,我用的是AdminLTE-2.3.0的模板。

html页面中的form如下:

  <body class="hold-transition login-page"><div class="login-box"><div class="login-logo"><a href="../../index.html">Name</a></div><!-- /.login-logo --><div class="login-box-body"><p class="login-box-msg">Sign in to start your session</p><form action="/login" method="post">{% if message %}<div class="alert alert-warning">{{ message }}</div>{% endif %}{% csrf_token %}<div class="form-group has-feedback"><input type="text" name="username" class="form-control" placeholder="username"><span class="glyphicon glyphicon-envelope form-control-feedback"></span></div><div class="form-group has-feedback"><input type="password" name="password" class="form-control" placeholder="password"><span class="glyphicon glyphicon-lock form-control-feedback"></span></div><div class="row"><div class="col-xs-8"><div class="checkbox icheck"><label><input type="checkbox"> Remember Me</label></div></div><!-- /.col --><div style="display: none;"><input id="next" type="text" name="next_url" value="{{ next_url }}" /></div><div class="col-xs-4"><button type="submit" class="btn btn-primary btn-block btn-flat">Sign In</button></div><!-- /.col --></div></form><a href="change_password">change password</a><br><a href="register" class="text-center">Register a new membership</a></div><!-- /.login-box-body --></div><!-- /.login-box -->

配合的还需要修改 app中的urls.py和views.py

urls.py:

urlpatterns = [path('', views.index, name='index'),path('index.html', views.index, name='index'),path('login', views.login_view, name='login'),]

views.py

def login_view(request):"""entry function of login page"""if request.method == "POST":username = request.POST.get('username')password = request.POST.get('password')next_url = request.POST.get("next_url")message = '请检查填写的内容!'if username.strip() and password:if authenticate(username=username, password=password):user = authenticate(username=username, password=password)if next_url and next_url != "logout":response = redirect(next_url)login(request, user)else:# response = redirect("index.html")login(request, user)response = redirect("index.html")# return redirect('index.html')return responseelse:message = '用户名或密码不正确!'return render(request, 'dashboard/pages/login/login.html', {'message': message})else:return render(request, 'dashboard/pages/login/login.html', {'message': message})next_url = request.GET.get("next", '')return render(request, 'dashboard/pages/login/login.html', {'next_url': next_url})

这样通过authenticate(username=username, password=password),我们自己的登录界面走的就是LDAP验证了。

Django登录并使用LDAP认证相关推荐

  1. 蓝鲸社区版5.1接入ldap认证

    简介 蓝鲸社区版5.1 介入公司内部ldap认证 官方文档社区版: 蓝鲸登录接入企业内部登录中已经通过接入google登录的例子进行说明:但是公司内部只有ldap作为内部服务的统一认证,并不提供相关登 ...

  2. Django框架(十八)—— auth框架:用户登录、注册、认证

    auth模块 一.什么是author模块 Auth模块是Django自带的用户认证模块,可以实现包括用户注册.用户登录.用户认证.注销.修改密码等功能.默认使用 auth_user 表来存储用户数据. ...

  3. jenkins 使用LDAP认证

    jenkins使用LDAP认证配置如下图所示: 用管理员账户登录jenkins,点击系统管理 ==> Configure Global Security 注意:我没有配置User search ...

  4. gitlab 将管理员权限移交给ldap账户_CDPDC中Atlas集成FreeIPA的LDAP认证

    文档编写目的Cloudera从CM6.3版本开始,引入了Red Hat IdM来做整个集群的认证,Red Hat IdM对应的软件为FreeIPA,在本文中描述如何使用FreeIPA来做CDP-DC集 ...

  5. linux程序网络验证,【redhat5.5】linux的LDAP认证服务器的配置及客户端pam网络验证实例...

    [1] LDAP简介 LDAP(Lightweight Directory Access Protocol) 代表轻量级目录访问协议 LDAP 是一种非关系型数据库 LDAP 可扩展性和灵活性良好 安 ...

  6. Jumpserver部署+Ldap认证

    这篇值得看看:Linux操作文档--jumpserver平台系统部署与使用_增发真人的博客-CSDN博客_www.nxgx 博主这里主要为了快,就使用官网的一键部署了: 安装部署 - JumpServ ...

  7. LDAP认证的两种方式

    LDAP认证的两种方式 [第一种] . FastBindLdapAuthenticationHandler 这种认证处理器一般用于DN是由用户名直接组成的,比如:uid=%u,ou=dev,dc=mi ...

  8. linux 证书文件权限,Linux运维之道之admin1.4(权限和归属,LDAP认证)

    admin1.4 权限和归属: 基本权限: 基本权限的类别: 访问方式(权限): ---读取:允许查看内容--read (r权限:能够ls浏览此目录内容) ---写入:允许修改内容--write (w ...

  9. Ubuntu下的源码浏览器Opengrok搭建 并集成LDAP认证登陆

    -前言 很多做android开发的小伙伴都知道,快速检索代码的利器opengrok,检索代码非常方便,本人之前多次搭建opengrok,只不过最近迫于代码安全性考虑,终于搞定opengrok+tomc ...

  10. JumpServer 整合ldap认证

    前提: ldap服务器已经安装:OpenLDAP安装部署 一.JumpServer安装 官网安装地址安装部署 - JumpServer 文档 1.一键部署 #系统版本 [root@localhost ...

最新文章

  1. Oracle快速复制表
  2. 后台给前台服务器控件添加样式
  3. OD使用教程 调试篇
  4. mtd-utils编译
  5. ue编辑器拖拽上传图片_Typora + PicGo打造超好用的Markdown编辑器
  6. [zz]grep 命令的使用
  7. uni-app——一种通过Nginx反向代理处理302重定向请求解决网络请求中无法获取Cookie的解决方案
  8. 【Protocol Buffer】Protocol Buffer入门教程(六):枚举和包
  9. 最大后验估计_PR Ⅱ:贝叶斯估计/推断及其与MAP的区别
  10. Spring webflow:上传多个文件
  11. linux 测试本地端口是否打开,关于bash:有效测试Linux是否打开了端口?
  12. IE下AJAX请求只有一次
  13. visio双线方框怎么画_visio透明框怎么画? visio绘制方框透明的教程
  14. 微信公众号之测试号申请
  15. Excel小技巧--高级漂亮的查询界面
  16. 1000瓶水有1瓶水有毒,老鼠喝一滴就会死,但是需要一周毒发,请问最少需要多少老鼠多少时间才能找到那瓶有毒的水。
  17. Mybatis-Plus教程
  18. 如何准备pmp考试?
  19. TexturePacker破解办法
  20. MPU6050加速度、角速度的解算以及互补滤波使用

热门文章

  1. Java itext tiff转换pdf
  2. realtek是什么意思_Realtek高清晰音频管理器 全解析
  3. 用户收货地址管理后端实现
  4. 输入一个网址到网页过程中都发生了什么?
  5. 老男孩python作业_老男孩python学习之作业一购物小程序
  6. 基于Vue的电商后台管理系统(2)
  7. TAOCP中最大公约数算法理解
  8. 只需3步完成,git迁移仓库地址,保留分支和历史记录
  9. win10 安装redis 解压版
  10. 实例讲解什么是Meta回归,怎么利用Meta回归发表文章!