之前有參照《企業內部登錄對接藍鯨智雲統一登陸》http://docs.bk.tencent.com/develop_center/enterprise_login/
來了解藍鯨社區版的登陸認證體系,嘗試着接入企業ldap認證,目前在藍鯨助手的幫助下已經實現接入,下面是接入教程和代碼片段,需要實驗的小夥伴可以從附件中下載源碼修改相應的內容。
特別說明:藍鯨登陸體系的ldap認證方式是通過api請求的方法來進行認證的,由於我比較懶不想額外部署api服務所以改爲ldap模塊驗證。
名稱申明:
服務器: 指的是藍鯨系統中open_paas所在的服務器
代碼路徑:/data/bkce/open_paas/login/bkaccount/
Pip路徑:/data/bkce/.envs/login/bin/pip
下面是具體的代碼段:
- 在代碼路徑下的enterprise文件夾下建立ldap.py驗證模塊:
2. 首先修改配置爲公司的ldap接口的地址等信息
然後填寫相關的驗證函數,其中驗證驗證信息返回的參數按照實際情況配置,如果不明白可以參考下ldap的教程。格式化返回數據,格式可以看api.py的相關注釋。
3. 修改api.py中的get_user_info函數:
修改函數將原本調用api驗證方式改爲函數驗證。
4. 修改backends.py中的authenticate 函數:
這裏我將獲取用戶信息和判斷登陸是否有效的方式都統一成get_user_info() 函數了,在將新用戶寫入到數據庫中需要注意中文名字的字符集編碼。註冊成功後默認設置新用戶爲普通用戶,方便管理後期的權限。
5. 將修改好的代碼上傳到代碼路徑的enterprise文件夾下。
修改代碼路徑下ee_loging/settings_login.py文件:
將bk_login 修改成 enterprise_ldap
6. 安裝ldap3模塊 pip install ldap3
7. 在控制機上重啓login服務,命令如下:
./bkcec stop paas login
./bkcec start paas login
8. 重啓完成後驗證是否可以登陸,如果有錯誤請查看日誌,日誌路徑:
/data/bkce/logs/open_pass/
Login_uwsgi.log login.log
# -*- coding: utf-8 -*-
import ldap3
#import json
class selectldap():
# ldap地址
ldap_ip = '192.168.39.22'
# ldap端口
ldap_port = 389
# ldap默認搜索區域
# ldap_dn = 'cn=svn_admin,ou=技術部,ou=總部區域二,ou=上海總部,ou=xinxindai,dc=xxd,dc=com'
ldap_dn = 'dc=xxd,dc=com'
# ldap賬號
ldap_admin = 'svn_admin'
# ldap密碼
ldap_pwd = 'Abcd!@#1234'
def get_user_info(self,kwargs={}):
# 獲取Form clean處理後的數據
host = self.ldap_ip
port = self.ldap_port
user = kwargs.get('username')
password = kwargs.get('password')
# print "user:%s pass:%s" % (user, password)
# 設置當前操作者
# data['operator'] = self.current_user.username
server = ldap3.Server(host, port, get_info=ldap3.ALL)
conn = None
auto_bind = True
try:
if user:
users = 'baina\\%s' % user
conn = ldap3.Connection(server, user=users, password=password, auto_bind=auto_bind,
authentication=ldap3.NTLM)
conn.search(self.ldap_dn, '(&(sAMAccountName=' + user + ')(objectclass=person))',
attributes=['mail', 'cn', 'mobile'])
email = conn.entries[0]['mail']
chname = conn.entries[0]['cn']
mobile = conn.entries[0]['mobile']
conn.unbind()
data = {
'username': "%s" % user,
'password': "%s" % password,
'real_name': "%s" % chname,
'mobile_phone' : "%s" % mobile,
'email': "%s" % email
}
#data = json.dumps(data)
result = {
'result': True,
"code": "00",
'message': "驗證用戶成功",
'data': data
}
#result = json.dumps(result)
# print result
return result
except Exception as e:
error = u"驗證失敗或其他錯誤:%s" % e
result = {
'result': False,
'message': error
}
return result