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)
|