0%

LDAP登录功能开发

LDAP验证登陆,对于大部分有自有邮件系统的公司来说,都是比较方便的,也省去了我们去管理账号。

我使用的是前后端分离的架构,对于前端来说,后端使用的是什么校验逻辑,这是不需要关心的。把账号密码按要求传给后端就是了,所以这里不做介绍了。

后端LDAP的代码写法视具体的开发语言而定,不过协议都是通用的,所以写法也是大同小异。

下面我以我在python-flask框架中的使用为例,我使用的是flask-ldap3-login这个库,实际他也是对原生的 ldap3这个库做的封装。

配置服务器信息

我在flask中用的,放在全局的配置文件里,可以根据自己的需求来定。

这里有个坑,一开始没有配置LDAP_USER_SEARCH_SCOPE,我照死连不上我司的服务器,官方配置没有做详细介绍。

1
2
3
4
5
6
7
8
9
'''
LDAP登录
'''
app.config['LDAP_HOST'] = 'ldap://192.168.1.101'
app.config['LDAP_BASE_DN'] = 'DC=testDomain,DC=com'
app.config['LDAP_USER_LOGIN_ATTR'] = 'sAMAccountName'
app.config['LDAP_BIND_USER_DN'] = 'admin@testDomain.com'
app.config['LDAP_BIND_USER_PASSWORD'] = "adminPassword"
app.config['LDAP_USER_SEARCH_SCOPE'] = 'SUBTREE'

封装

根据自己的需求进一步扩展封装api。

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
28
29
30
31
32
33
34
35
from flask_ldap3_login import LDAP3LoginManager
from app import app

class ladpAuth():

def __init__(self):
self.ldap_manager = LDAP3LoginManager()
self.ldap_manager.init_config(app.config)

def auth(self,username,password):
response = self.ldap_manager.authenticate(username,password)
if response.status.value == 2:
return ({
'name':response.user_info.get('name'),
'displayName':response.user_info.get('displayName'),
'mail':response.user_info.get('mail'),
})
else:
return None

def getUserInfoForUsername(self,username):
try:
user_info = self.ldap_manager.get_user_info_for_username(username)
return ({
'name': user_info.get('name'),
'displayName': user_info.get('displayName'),
'mail': user_info.get('mail'),
})
except:
return None


if __name__ == '__main__':
userInfo = ladpAuth().getUserInfoForUsername('orionc')
print(userInfo)

调用

我只是用LDAP作为了一个登陆验证工具,当账号密码验证通过后,如果是首次登陆,我会去把对应的用户的信息入库用来展示。

1
2
userInfo = ladpAuth().auth(userName, password)
userId = getUserId(userInfo)