django中ldap验证的三种方式,你需要哪种?

方法一:django中settings添加ldap验证及自动记录用户信息到本地user表中,感觉麻烦的可以看方法二

# settings配置
import ldap
from django_auth_ldap.config import LDAPSearch

AUTHENTICATION_BACKENDS = (
	# 配置为先使用LDAP认证,如通过认证则不再使用后面的
    'django_auth_ldap.backend.LDAPBackend',
     # 本地用户验证,如果不需要的,可以注释掉
    'django.contrib.auth.backends.ModelBackend',
)

base_dn = 'dc=baidu,dc=com'	# ldap的域名信息(例如baidu.com,可以拆分为baidu跟com)
AUTH_LDAP_SERVER_URI = 'ldap://xxx.xxx.xxx.xxx:389'	# ldap服务器地址及端口
AUTH_LDAP_BIND_DN = 'xxx@baidu.com'	# 用户名,可以使用自己的用户名,用户名后面要加上域名
AUTH_LDAP_BIND_PASSWORD = 'xxx'	# 对应用户名的密码
# LDAPSearch参数1:搜索的用户信息,ou是组织,后面格式化输出的是你的用户名信息,
# 参数2:默认,参数3:搜索的用户,我使用的user,有的公司是uid,如果不知道,可以尝试下
AUTH_LDAP_USER_SEARCH = LDAPSearch('ou=你的组织,%s' % base_dn, ldap.SCOPE_SUBTREE, "(SamAccountName=%(user)s)")	
AUTH_LDAP_ALWAYS_UPDATE_USER = True

# key为数据库字段名,value为ldap中字段名,此字典解决django model与ldap字段名可能出现的不一致问题
# 例如:用户名,在自己django的user表中字段是username,但是在ldap中字段是sAMAccountName,利用此配置可以同步
AUTH_LDAP_USER_ATTR_MAP = {
    "username": "sAMAccountName",
    "name": "physicalDeliveryOfficeName",
    "email": "mail",
    'title': 'title',
    'company': 'company',
    'department': 'department',
}

用户登录验证

# 用户登录view
from rest_framework.response import Response
from rest_framework.views import APIView
from django.contrib.auth import authenticate

class Login(APIView):

    def post(self, request):
        username = request.data.get('username', None)
        password = request.data.get('password', None)
        # 先验证ldap账户,如果不存在,则会验证本地用户
        ldap_user = authenticate(username=username, password=password)
        # 验证通过后,可以看到,本地user表中,会自动添加一条同步的用户信息
        if ldap_user:
            return Response(
                {'code': 200, 'uid': ldap_user.id, 'name': ldap_user.name, 'department': ldap_user.department}
            )
        return Response({'code': 405, 'message': '用户名或密码错误'})

方法二:这是一种更加简单的,适用与验证该用户是否存在的ldap认证方式,如果需要同步本地用户,上面的方法更适合
此方法不需要配置settings,同样可以查询用户信息的方法,你可以在登录时,调用此方法,进行验证,或者获取一些信息,
什么?还麻烦?那你只能看方法三了

from ldap3 import Server, Connection, ALL, NTLM

def new_auth_user(username, password):
	# 链接服务,参数一:服务器ip
    server = Server('xxx.xxx.xxx.xxx', get_info=ALL)
    # user中要拼接用户的域,例如,域名是baidu.com,则可以修改为:'baidu\\' + username
    conn = Connection(server, user='baidu\\' + username, password=password, auto_bind=True, authentication=NTLM)
    # 配置搜索的组织及域名,例如域名为baidu.com,则可以如下配置。第二个参数,需要搜索的用户名,
    # 第三个参数,搜索用户的信息,*代表所搜该用户的所有信息,可以根据需要进行修改,必定很多信息我们用不到
    conn.search('ou=你的组织,dc=baidu,dc=com', '(SamAccountName=搜索的用户名)', attributes=['*'])
    result = conn.entries
    print(result)

方法三:此方法只能认证用户是否存在

import ldap

def auth_user(username, password):
    conn = ldap.initialize(ldap服务器地址:'xxx.xxx.xxx.xxx:389')
    try:
        # 将username附加上域名
        username += '@xxxxx.com'
    	# 验证用户是否存在,存在返回1,不存在,则会报错
        conn.simple_bind_s(username, password)
        return 1
    except Exception as e:
        return e
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tian丶Yuting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值