LDAP modifications

Table of contents

背景

程式說明

以下是程式碼中的輸入、輸出、重要邏輯及深奧部分的解釋:

輸入

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 資訊能正確寫入員工模組。