LDAP modifications
Table of contents
背景
- original source code
程式說明
以下是程式碼中的輸入、輸出、重要邏輯及深奧部分的解釋:
輸入
1. _login 函數
• db: 資料庫名稱
• credential: 包含使用者的登入資訊 (login, password)
• user_agent_env: 用戶端環境參數
2. _check_credentials 函數
• credential: 驗證憑證 (type, password)
• env: 當前執行環境
3. change_password 函數
• old_passwd: 使用者的舊密碼
• new_passwd: 使用者的新密碼
輸出
1. _login 成功時回傳字典,包含:
• uid: 使用者的 ID
• auth_method: 認證方法 (如 ldap)
• mfa: 多因素認證設置
2. _check_credentials 成功驗證時回傳與 _login 類似的字典。
3. change_password 成功時回傳布林值:True。
重要邏輯
1. LDAP 驗證邏輯整合 使用 LDAP 為後備驗證方案:
• _login: 如果內部驗證失敗,會嘗試通過 LDAP 驗證。
• _check_credentials: 若密碼匹配失敗,則嘗試 LDAP 進行二次驗證。
2. 自動創建 LDAP 使用者
• 當 LDAP 驗證通過,但使用者不存在於系統中,會透過 _get_or_create_user 自動創建。
3. 密碼重置
• 當成功變更密碼時,系統會將舊密碼清空,保證 LDAP 管理新密碼。
較深奧的程式碼解釋
1. 透過 SQL 檢查使用者是否存在
cr.execute("SELECT id FROM res_users WHERE lower(login)=%s", (login,))
res = cr.fetchone()
• 使用 SQL 查詢直接檢索資料庫,提升效率。
• 比對使用者的登入名稱是否已存在(忽略大小寫)。
2. LDAP 驗證整合
for conf in Ldap._get_ldap_dicts():
entry = Ldap._authenticate(conf, login, credential['password'])
if entry:
return {
'uid': Ldap._get_or_create_user(conf, login, entry),
'auth_method': 'ldap',
'mfa': 'default',
}
• _get_ldap_dicts: 獲取所有 LDAP 配置。
• _authenticate: 驗證使用者是否通過 LDAP 認證。
• _get_or_create_user: 若使用者不存在,則在本地創建。
3. 密碼清空邏輯
self.env.cr.execute(
'UPDATE res_users SET password=NULL WHERE id=%s',
(self.id,)
)
• 直接更新資料庫中使用者密碼為 NULL,確保密碼只在 LDAP 中管理。
這段程式碼的主要深度在於將內部驗證和 LDAP 驗證緊密結合,並自動同步使用者資訊,同時有效處理密碼管理邏輯。
部門等資訊
我想從LDAP取出使用者的部門等等資訊,看來似乎這支程式沒有線索?
您提供的程式碼主要專注於使用者驗證和密碼管理,並未包含從 LDAP 提取使用者部門等資訊的功能。如果需要從 LDAP 獲取使用者的詳細資訊,建議檢查以下功能是否適用:
1. LDAP 驗證相關方法 程式中使用的 `_authenticate` 和 `_get_or_create_user` 可能涉及 LDAP 查詢,您可以檢查這些函數的實現。
2. 自定義查詢 使用像 ldap3 或 `python-ldap` 的 Python 套件,手動連接 LDAP 並執行查詢以獲取部門等資訊,例如:
from ldap3 import Server, Connection
server = Server('ldap.example.com')
conn = Connection(server, 'user_dn', 'password', auto_bind=True)
conn.search('dc=example,dc=com', '(uid=username)', attributes=['department'])
print(conn.entries)
如果需要進一步整合到現有的 Odoo 程式中,可以擴展 res.company.ldap 模組,為您的需求添加專屬查詢邏輯。
我看到你講的模組了。我最終的目的是讓同仁經由Ldap帳密登入後,其他資訊自動代入到Odoo的員工資料庫、包括部門與員工編號。似乎應該在員工模組增加?
是的,您的需求確實可以透過修改 Odoo 的員工模組來實現:
1. 擴展員工模組
您可以自定義 hr.employee 模組,讓 Odoo 在使用者透過 LDAP 驗證時,自動從 LDAP 獲取其他資訊(例如部門與員工編號),並同步到員工資料庫。
2. 集成 LDAP 信息
使用現有的 res.company.ldap 模組,在 _authenticate 方法或相關模組中擴展邏輯,加入額外的 LDAP 查詢來提取所需資訊。
3. 同步資料
在 res.users 和 hr.employee 之間建立聯繫,通過身份驗證後更新員工數據。例如: • 在 res.users 內擴展 _get_or_create_user 方法,將 LDAP 中獲取的屬性寫入 hr.employee。
4. 範例邏輯
def _update_employee_info_from_ldap(self, conf, ldap_entry):
emp_model = self.env['hr.employee']
emp_vals = {
'name': ldap_entry['displayName'][0],
'department_id': self._get_department_from_ldap(ldap_entry),
'identification_id': ldap_entry.get('employeeNumber', [None])[0],
}
emp = emp_model.search([('user_id', '=', self.id)], limit=1)
if emp:
emp.write(emp_vals)
else:
emp_vals.update({'user_id': self.id})
emp_model.create(emp_vals)
5. 落地計畫
• 檢查 LDAP 結構,確認能查到所需資訊。
• 調整 res.company.ldap 模組,添加自動同步邏輯。
• 測試登入流程,確保 LDAP 資訊能正確寫入員工模組。