- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Django项目中添加ldap登陆认证功能的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文详细介绍了django-auth-ldap的使用方法,参数含义,并提供了示例代码 。
版本说明 。
集成过程 。
django集成ldap认证有现成的django-auth-ldap模块可以使用,本文也主要以这个模块的使用为主,先安装模块 。
1
|
pip install django
-
auth
-
ldap
|
然后在setting.py全局配置文件中添加如下内容就可以正常使用了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import
ldap
from
django_auth_ldap.config
import
ldapsearch, groupofnamestype
# baseline configuration.
auth_ldap_server_uri
=
'ldap://ldap.ops-coffee.cn'
auth_ldap_bind_dn
=
'uid=authz,ou=public,dc=ops-coffee,dc=cn'
auth_ldap_bind_password
=
'czfdx629k7'
auth_ldap_user_search
=
ldapsearch(
'ou=people,dc=ops-coffee,dc=cn'
,
ldap.scope_subtree,
'(uid=%(user)s)'
,
)
# or:
# auth_ldap_user_dn_template = 'uid=%(user)s,ou=people,dc=ops-coffee,dc=cn'
auth_ldap_user_attr_map
=
{
'first_name'
:
'cn'
,
'last_name'
:
'sn'
,
'email'
:
'mail'
,
}
authentication_backends
=
(
'django_auth_ldap.backend.ldapbackend'
,
'django.contrib.auth.backends.modelbackend'
,
)
|
这里详细解释下上边配置的含义:
auth_ldap_server_uri: ldap服务器的地址 。
auth_ldap_bind_dn: 一个完整的用户dn,用来登录ldap服务器验证用户输入的账号密码信息是否正确 。
auth_ldap_bind_password: bind_dn用户的密码,这里我们简单说明下ldap的认证逻辑以便更好的理解为啥需要这两个配置 。
django使用auth_ldap_bind_dn和auth_ldap_bind_password作为用户名和密码登陆ldap服务器,根据auth_ldap_user_search指定的查询规则来查找用户输入的属性(即username)的值有没有,如果查找的条数为0或者大于1,则返回错误,如果查找的条数等于1,则使用查找到的这个条目的dn和用户输入的密码进行匹配验证,成功则返回成功允许登录,失败则不允许登录 。
auth_ldap_user_search: 可通过ldap登录的用户的范围,如上配置会去ou=people,dc=ops-coffee,dc=cn下搜索用户是否存在 。
其中(uid=%(user)s)'指明了作为django的username所对应的ldap的属性,这里为ldap用户的uid属性作为django的username 。
以上配置是在一个ou下查找用户,当需要在多个ou下搜索用户时用如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from
django_auth_ldap.config
import
ldapsearch, ldapsearchunion
auth_ldap_user_search
=
ldapsearchunion(
ldapsearch(
'ou=public,dc=ops-coffee,dc=cn'
,
ldap.scope_subtree,
'(uid=%(user)s)'
),
ldapsearch(
'ou=people,dc=ops-coffee,dc=cn'
,
ldap.scope_subtree,
'(uid=%(user)s)'
),
)
|
auth_ldap_user_attr_map: ldap中的用户属性跟django后台用户属性的对应关系,当用户第一次登录且验证成功后会将ldap中对应的用户属性写入到django的user表中 。
authentication_backends: 配置django的后端认证列表 。
当django调用auth.authenticate方法进行验证时,django将尝试authentication_backends元组中指定的所有认证后端。如果第一个认证方法失败了,django将会继续尝试下一个,直到所有认证方式都尝试完成 。
django默认的认证后端是django.contrib.auth.backends.modelbackend,如上配置我们添加了ldap的认证到authentication_backends中,那么django在登录的时候就会先去ldap服务器验证用户,验证失败后再去查询本地数据库的user表进行验证,如果只希望django验证ldap不验证本地数据库的话去掉authentication_backends中的modelbackend配置即可 。
其他几个django-auth-ldap的全局配置参数解释如下:
auth_ldap_always_update_user: 是否同步ldap的修改,默认为true,即当ldap中用户的属性修改后用户通过ldap系统认证时自动同步更新到django的user表中,如果设置为false则不自动更新 。
auth_ldap_cache_timeout: 设置ldap认证缓存的时间 。
登录验证 。
上边的配置没有问题后就可以通过ldap系统账号进行登录操作了,默认登陆逻辑及前端登录代码均无需修改,可以参考github的相关代码,地址:
高级配置 。
所谓高级配置这里主要是说明下django-auth-ldap中组相关的配置,这需要对ldap的组有一定的概念,为了方便理解,接下来我们以实际的例子来说明 。
假如我们有三个组overmind、kerrigan、admin,配置如下:
1
2
3
4
5
6
|
# ldapsearch -lll -x -d "uid=authz,ou=public,dc=ops-coffee,dc=cn" -w "czfdx629k7" -b cn=overmind,ou=group,dc=ops-coffee,dc=cn
dn: cn
=
overmind,ou
=
group,dc
=
ops
-
coffee,dc
=
cn
cn: overmind
member: uid
=
sre,ou
=
people,dc
=
ops
-
coffee,dc
=
cn
objectclass: groupofnames
objectclass: top
|
1
2
3
4
5
6
7
|
# ldapsearch -lll -x -d "uid=authz,ou=public,dc=ops-coffee,dc=cn" -w "czfdx629k7" -b cn=kerrigan,ou=group,dc=ops-coffee,dc=cn
dn: cn
=
kerrigan,ou
=
group,dc
=
ops
-
coffee,dc
=
cn
cn: kerrigan
objectclass: groupofnames
objectclass: top
member: uid
=
u1,ou
=
public,dc
=
ops
-
coffee,dc
=
cn
member: uid
=
u2,ou
=
people,dc
=
ops
-
coffee,dc
=
cn
|
1
2
3
4
5
6
|
# ldapsearch -lll -x -d "uid=authz,ou=public,dc=ops-coffee,dc=cn" -w "czfdx629k7" -b cn=admin,ou=group,dc=ops-coffee,dc=cn
dn: cn
=
admin,ou
=
group,dc
=
ops
-
coffee,dc
=
cn
cn: admin
member: uid
=
u3,ou
=
admin,dc
=
ops
-
coffee,dc
=
cn
objectclass: groupofnames
objectclass: top
|
我们需要实现django集成ldap认证,且不允许隶属于kerrigan分组的用户登录系统,如果用户隶属于admin分组,则需要在登录django时给设置为管理员,接下来的配置将会解释如何实现该需求 。
django-auth-ldap中与group有关的配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
auth_ldap_group_search
=
ldapsearch(
'ou=group,dc=ops-coffee,dc=cn'
,
ldap.scope_subtree,
'(objectclass=groupofnames)'
,
)
auth_ldap_group_type
=
groupofnamestype(name_attr
=
'cn'
)
# simple group restrictions
# auth_ldap_require_group = 'cn=overmind,ou=group,dc=ops-coffee,dc=cn'
auth_ldap_deny_group
=
'cn=kerrigan,ou=group,dc=ops-coffee,dc=cn'
auth_ldap_user_flags_by_group
=
{
'is_superuser'
:
'cn=admin,ou=group,dc=ops-coffee,dc=cn'
,
}
|
以上配置的详细解释如下:
auth_ldap_group_search: 搜索某个ou下的信息,与auth_ldap_user_search参数类似,这里的ou一般指group,例如ou=group,dc=ops-coffee,dc=cn的组目录 。
auth_ldap_group_type: 返回的组的类型,组dn的第一个属性值,例如组dncn=overmind,ou=group,dc=ops-coffee,dc=cn,那么这里为cn 。
auth_ldap_require_group: 设置允许哪些组成员登录,如果我们只允许overmind组的成员可以登录系统的话这里可以设置 。
1
|
auth_ldap_require_group
=
'cn=overmind,ou=group,dc=ops-coffee,dc=cn'
|
auth_ldap_deny_group: 设置拒绝哪些组成员登录,如果我们不允许kerrigan组的成员可以登录系统的话这里可以设置 。
1
|
auth_ldap_deny_group
=
'cn=kerrigan,ou=group,dc=ops-coffee,dc=cn'
|
当我们同时设置了用户既属于overmind组又属于kerrigan组,也就是这个用户即设置了允许登录,又设置了拒绝登录,那么以拒绝登录为准,用户无法登录 。
auth_ldap_user_flags_by_group: 根据ldap的group设置django用户的额外属性,例如我们想要设置ldap中 。
admin组具有django中超级管理员的权限,除了在django中手动设置外,还可以直接在setting中配置 。
1
2
3
4
|
auth_ldap_user_flags_by_group
auth_ldap_user_flags_by_group
=
{
'is_superuser'
:
'cn=admin,ou=group,dc=ops-coffee,dc=cn'
,
}
|
当admin组用户登录的时候就会自动给用户的is_superuser属性设置为true 。
至此我们对django-auth-ldap有了一个全面的了解,在实际项目集成中可以做到游刃有余,如有问题可以参考我github的代码 。
踩坑记录 。
windowns 10下安装python-ldap即django-auth-ldap报错:
c:\users\ops-coffee\appdata\local\temp\pip-install-sec1o036\python-ldap\modules\constants.h(7): fatal error c1083: cannot open include file: 'lber.h': no such file or directory error: command 'c:\\program files (x86)\\microsoft visual studio 14.0\\vc\\bin\\x86_amd64\\cl.exe' failed with exit status 2 。
这个报错需要手动安装下whl文件,具体方法为: 先在这个网站下载对应版本的python-ldap的whl文件 。
然后使用pip命令安装whl,注意文件路径要正确 。
1
2
3
4
5
6
|
d:\demo\openldap>python
-
m pip install python_ldap
-
3.2
.
0
-
cp36
-
cp36m
-
win_amd64.whl
processing d:\demo\openldap\python_ldap
-
3.2
.
0
-
cp36
-
cp36m
-
win_amd64.whl
requirement already satisfied: pyasn1>
=
0.3
.
7
in
c:\python36\lib\site
-
packages (
from
python
-
ldap
=
=
3.2
.
0
) (
0.4
.
2
)
requirement already satisfied: pyasn1
-
modules>
=
0.1
.
5
in
c:\python36\lib\site
-
packages (
from
python
-
ldap
=
=
3.2
.
0
) (
0.2
.
4
)
installing collected packages: python
-
ldap
successfully installed python
-
ldap
-
3.2
.
0
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://www.jianshu.com/p/db62586b438f 。
最后此篇关于Django项目中添加ldap登陆认证功能的实现的文章就讲到这里了,如果你想了解更多关于Django项目中添加ldap登陆认证功能的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我们正在构建一个新的库,它需要对我们的主要身份管理 LDAP 系统进行读/写。 我们正在考虑使用 Spring LDAP ( http://projects.spring.io/spring-ldap
在 LDAP 身份验证的情况下, 是什么?参数 一般用于身份验证 .我想对于通过 ldap 登录的用户来说,使用 DN 会很头疼,因为它太大而无法记住。 使用 uid 或 sAMAccountName
我知道 LDAP 用于提供一些信息并帮助促进授权。 但是 LDAP 的其他用途是什么? 最佳答案 我将重点讨论为什么使用 LDAP,而不是 LDAP 是什么。 使用模型类似于人们使用借书卡或电话簿的方
我正在尝试查询 LDAP 服务器以获取使用 ruby 的 net-ldap 库的任何组的详细信息 require 'rubygems' require 'net/ldap' username =
在使用 spring ldap 模板的 Ldap 搜索中,我返回一个 User 对象,该对象具有保存另一个用户的 dn 的属性之一。并且,User 对象有一些属性需要使用其他用户的 ldap 条目获取
我正在尝试使用例如search_s函数根据对象的完整可分辨名称搜索对象,但我觉得这并不方便。例如, search_s('DC=example, DC=com', ldap.SCOPE_SUBTREE,
LDAP 查询如何工作:-(我)。 Windows Powershell(二). Java JNDI(三)。 SpringLDAP 上述 3 种方法中的 LDAP 筛选器查询是否仅搜索前 1000 条
我们正在使用 spring security 在我们的应用程序中对来自 LDAP 的用户进行身份验证。认证部分工作正常,但授权部分不工作。 我们无法从 LDAP 中检索用户的角色。 来自本书 《 Sp
这个问题在这里已经有了答案: Does the LDAP protocol limit the length of a DN (3 个回答) 关闭8年前。 DN 是否有最大长度?如果我想将它们存储在数
我知道我的谷歌搜索技能让我失望了,因为那里有 必须是这样的:一个简单、易于使用的远程托管目录服务(更好的是,通过几个不同的接口(interface)和 SSO 公开用户目录)。 你知道一个和/或有一个
我有一个使用 JSF 2.1 和 JEE 6 设置的 Web 应用程序,该应用程序在 WebLogic 12.1.2 服务器上运行,并带有用于身份验证的 openLDAP。我一直注意到在应用程序中加载
我的应用程序每天执行一次 LDAP 查询并获取给定容器中的所有用户和组。获取后,我的应用程序将遍历组的用户列表,仅将新用户添加到我的应用程序数据库中(它仅添加用户名)。 如果有 50,000 个用户,
我正在尝试解决一个问题,即尝试通过 LDAP 设置用户密码失败,因为访问被拒绝错误 - 即使我正在使用管理员用户对 AD 进行身份验证。 在 stackoverflow 中找到的答案说,要么我必须以管
我有一个我没有完全权限的 LDAP 服务器和一个我是 root 的具有 LDAP 身份验证的 ubuntu 系统。是否可以将 LDAP 用户添加到本地组? (我不知道我的表述是否正确,但我想要的只是在
我有一个属性(groupIDNumber),我想让它作为自动递增数字工作? 我们如何定义该属性? 感谢您的帮助, -纳米 最佳答案 这不是 LDAP 协议(protocol)的一部分,也不是标准的做法
对“uid”属性执行不区分大小写匹配的语法是什么?如果属性定义很重要,那么它将如何更改?特别是我将 ApacheDS 用于我的 LDAP 存储。 最佳答案 (uid=miXedCaseUSer)将匹配
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我需要有关 LDAP 搜索过滤器的信息来提取嵌套组成员资格。基本上,我的想法是,例如,一个用户属于 5 个组 [A、B、C、D、E]我可以编写单个 LDAP 搜索查询来获取组 [A、B、C、D、E]
我关注了 installing ldap on centos 在我的服务器上设置 LDAP 服务器的指南,完成所有安装步骤后,我执行了 ldapsearch -x -b "dc=test,dc=com
我想编写一个 LDAP 查询来测试用户 (sAMAccountName) 是否是特定组的成员。是否可以这样做以便我获得 0 或 1 个结果记录? 我想我可以获取用户的所有组并测试每个组是否匹配,但我想
我是一名优秀的程序员,十分优秀!