Odoo 连接ldap 域认证

 附一个验证ldap的python代码。

复制代码
import socket
from ldap3 import Server, Connection, ALL

class LDAPClient:
    def __init__(self, host, port, user_dn, password):
        self.host = host
        self.port = port
        self.user_dn = user_dn
        self.password = password
        self.server = Server(host, port=port, get_info=ALL)
        self.conn = None

    def is_port_open(self):
        """
        检查远程主机的指定端口是否开放
        :return: 端口开放返回True,否则返回False
        """
        try:
            with socket.create_connection((self.host, self.port), timeout=5) as sock:
                return True
        except (socket.timeout, ConnectionRefusedError):
            return False

    def test_ldap_service(self):
        """
        使用ldap3库验证LDAP服务是否正常
        :return: 验证成功返回True,否则返回False
        """
        try:
            self.conn = Connection(self.server, user=self.user_dn, password=self.password, auto_bind=False)
            if self.conn.bind():
                print("LDAP服务验证成功")
                return True
            else:
                print(f"LDAP服务验证失败: {self.conn.result}")
                return False
        except Exception as e:
            print(f"LDAP服务验证失败: {e}")
            return False
        
    def list_all_users(self, search_base):
            """
            列出所有用户
            :param search_base: 搜索的基准DN
            :return: 用户列表
            """
            try:
                if not self.conn:
                    self.conn = Connection(self.server, user=self.user_dn, password=self.password, auto_bind=True)
                
                self.conn.search(search_base, '(objectClass=person)', attributes=['cn', 'givenName', 'sn'])
                
                if self.conn.entries:
                    print("用户列表如下:")
                    for entry in self.conn.entries:
                        print(entry)
                    return self.conn.entries
                else:
                    print("未找到用户")
                    return []
            except Exception as e:
                print(f"列出用户失败: {e}")
                return []

    def search_user_and_verify_password(self, search_base, search_filter):
        """
        查询用户并验证密码
        :param search_base: 搜索的基准DN
        :param search_filter: 搜索过滤器
        :return: 验证成功返回True,否则返回False
        """
        try:
            if not self.conn:
                self.conn = Connection(self.server, user=self.user_dn, password=self.password, auto_bind=True)
            
            self.conn.search(search_base, search_filter, attributes=['cn', 'givenName', 'sn'])
            
            if self.conn.entries:
                print("用户查询成功,用户信息如下:")
                for entry in self.conn.entries:
                    print(entry)
                return True
            else:
                print("未找到用户")
                return False
        except Exception as e:
            print(f"用户查询或验证失败: {e}")
            return False
        
    def get_user_dn(self, search_base, username):
        """
        获取用户的DN
        :param search_base: 搜索的基准DN
        :param username: 用户名
        :return: 用户DN或None
        """
        try:
            if not self.conn:
                self.conn = Connection(self.server, user=self.user_dn, password=self.password, auto_bind=True)
            
            search_filter = f"(cn={username})"
            self.conn.search(search_base, search_filter, attributes=['cn'])
            
            if self.conn.entries:
                user_dn = self.conn.entries[0].entry_dn
                print(f"找到用户DN: {user_dn}")
                return user_dn
            else:
                print("未找到用户")
                return None
        except Exception as e:
            print(f"获取用户DN失败: {e}")
            return None

    def verify_user_credentials(self, search_base, username, password):
        """
        验证用户名和密码
        :param search_base: 搜索的基准DN
        :param username: 用户名
        :param password: 用户密码
        :return: 验证成功返回True,否则返回False
        """
        user_dn = self.get_user_dn(search_base, username)
        if not user_dn:
            return False

        try:
            # 使用用户DN和密码创建一个新的连接以验证用户凭据
            test_conn = Connection(self.server, user=user_dn, password=password, auto_bind=True)
            if test_conn.bind():
                print("用户名和密码验证成功")
                return True
            else:
                print("用户名和密码验证失败")
                return False
        except Exception as e:
            print(f"验证用户名和密码失败: {e}")
            return False

if __name__ == "__main__":
    ldap_host = "192.168.2.51"
    ldap_port = 389
    admin_user_dn = "cn=********,ou=********,dc=wywr,dc=top"  # 管理员账号DN
    admin_password = "********"  # 管理员密码
    test_username = "jackadam"  # 要测试的用户名
    test_password = "********"  # 要测试的用户密码
    search_base = "dc=wywr,dc=top"

    client = LDAPClient(ldap_host, ldap_port, admin_user_dn, admin_password)

    # 检查端口是否开放
    if client.is_port_open():
        print(f"LDAP端口 {ldap_port} 开放")
        # 验证LDAP服务
        if client.test_ldap_service():
            print("LDAP服务正常")
            # 列出所有用户
            client.list_all_users(search_base)
            # 验证测试用户的用户名和密码
            if client.verify_user_credentials(search_base, test_username, test_password):
                print("测试用户的用户名和密码验证成功")
            else:
                print("测试用户的用户名和密码验证失败")
        else:
            print("LDAP服务异常")
    else:
        print(f"LDAP端口 {ldap_port} 未开放")
复制代码

 

 

 

注意:

公司是选的,不是建的

模板用户也是选的,如果没有模板用户,要新建。

 
错误:
 LdapErr: DSID-0C090CF8, comment: In order to perform this operation a successful bind must be completed on the connection.

 

官方说明#

LDAP 身份验证#

要在 Odoo 中配置 LDAP 身份验证:

  1. 打开“设置”应用程序,向下滚动到“集成”部分,然后启用 LDAP 身份验证。

  2. 单击 Save,然后返回 Integrations 部分并单击 LDAP Server。

  3. 在 Set up your LDAP Server 列表中,单击 New (新建),然后选择所需的 company 在下拉列表中。

  4. 在 Server information (服务器信息) 部分中,分别在 LDAP 服务器地址 和 LDAP 服务器端口 字段中输入服务器的 IP 地址和端口。

  5. 启用 使用 TLS 以在连接到 LDAP 时请求安全的 TLS/SSL 加密 server,前提是服务器启用了 StartTLS。

  6. 在 Login information (登录信息) 部分中,输入用于 在 LDAP binddn 和 LDAP password 字段中查询服务器, 分别。如果字段留空,服务器将匿名执行查询。

  7. 在 Process parameter (流程参数) 部分中,输入:

    • LDAP 基字段中使用 LDAP 格式的 LDAP 服务器名称 (例如,dc=example,dc=com);

    • uid=%s在 LDAP 过滤器字段中。

  8. 在 User information (用户信息) 部分中:

    • 启用 创建用户 ,以便在有人首次登录时在 Odoo 中创建用户配置文件 使用 LDAP;

    • 选择 User 模板,用于创建新用户配置文件。如果没有模板 ,则使用管理员的配置文件。

注解

使用 Microsoft Active Directory (AD) 进行 LDAP 身份验证时,如果用户遇到登录 问题 尽管使用了有效的凭据,但请创建新的系统参数以禁用引荐追踪 在 LDAP 客户端中:

  1. 激活开发人员模式。

  2. 转到 设置 ‣ 技术 ‣ 系统参数 ,然后单击 新建 。

  3. 填写字段:

    • 键:auth_ldap.disable_chase_ref

    • 值:True

数据库:#

表: ir.config_parameter

key: auth_ldap.disable_chase_ref

值: True

 

作者:上官飞鸿

出处:https://www.cnblogs.com/jackadam/p/18527095

版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。

posted @   上官飞鸿  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示