服务器采用pam_ldap认证 体系,采用open_ldap2.4.x,认证机制是通过前端调用pam认证的do_pam_authenication()函数【进行用户身份验证,普通用户和ldap用户都会进入这个函数,这个函数没有ldap用户操作的句柄LDAP* ld】,*然后函数直接跳转到
ldap的认证函数ldap_sm_authenication【用于ldap用户认证,里面定义了 LDAP* ld*主要进行ldap用户的认证】,在其中调用了Openldap的ldap_simple_bind_s()进行服务器绑定,ldap_simple_bind_s()调用ldap_initialize()进行和ldap服务器建立连接,然后进行用户身份认证,认证完成后返回ldap_success【0】表示成功认证,设置之后采用ldap用户可以正常访问,但是用户登录登出之后会多建立一个登录页面网址到ldap服务器之间的一个tcp连接,这个连接不会超时,直到重启登录认证的服务器。
我配置过了ldap登录认证的超时方式,在ldap_initialize()之后ldap_simple_bind_s()之前进行了超时机制设置:ldap_set_option(ld, LDAP_OPT_TIMELIMIT,&timeout),ldap_set_option(ld, LDAP_OPT_NETWORK_TIMEOUT,&timeout),
最后发现在pam_sm_authenication()函数中调用ldap_simple_bind_s()之后return之前没有进行ldap_unbind(ld),由于pam_sm_authenication()在调用之后就返回了pam认证,也就是说,pam_sm_authenication() return之后函数执行过程就不会再有LDAP ld 这种类型,我在*pam_sm_authenication() return之前进行了ldap_unbind(),结果发现ldap登录出现问题,提示网络或服务器异常,代码日志发现程序执行停在了我设置ldap_unbind()的地方。**
我想知道pam_ldap认证过程中当用户名、密码认证成功之后他的LDAP *ld 句柄什么时候释放,ldap_unbind()什么时候调用(如果必须要调用的话),还有最重要的一点:LDAP服务器和登录网站建立的TCP连接什么时候应该释放掉