方法一: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