关于DISCUZ不用通行证登陆得内容介绍 DISCUZ是中国最常用的论坛,虽然他本身有通行证给大家连接,但实际上用户的统一还是很不好,经常要建立两个用户表,第一不利于注册和管理,第二浪费数据库。 最近做一个项目也是使用的DISCUZ,所以研究了一下DISCUZ的登陆,基本完成了同步登陆。大家如果有兴趣可以研究一下。 别的不废话了,如果你自己写的系统,可以直接用DISCUZ的公用文件,直接引用include/common.inc.php就好了,这样最简单了,只要引用这个文件,$discuz_uid就是你的用户ID了,$discuz_user就是你的用户名, 如果你用的自己的公用文件,就要提取两个函数,在global.func.php中,有两个函数 Dsetcookie,和authcode,如果你不懒的话在复制一个函数clearcookies,第一个就是DISCUZ自己的建造COOKIE的函数,第二个是DISCUZ的可逆加密函数,第三个是清除COOKIE函数,我是放到我自己的FUNC.PHP文件中了 好了,咱们开始写建立和识别COOKIE的方法了 function lgoin($array) { $username = $array['username']; $password = $array['password']; $sql = "SELECT uid ,password ,secques FROM cdb_members WHERE
username ='$username' and password =md5('$password')"; try { $rs = $this -> _db -> query($sql); }catch (Exception $e){ exit("查询出错,出错信息:".$e->getMessage()); return 0; } $row = $this -> _db -> fetch($rs); //查询登陆的用户名和密码是否正确 if($row){ dsetcookie('sid','',-2423234234); // 注销掉sid $secques = $row['secques']; $uid = $row['uid']; $formPassword = $row['password']; dsetcookie('auth',authcode("$formPasswordt$secquest$uid",'ENCODE','123'),'0'); return 1; }else{ return 2; } } 这是一个登陆函数,废话不说了,直接说关键部分吧,在查询之后,当获得到信息后,(用户名和密码正确的话)我们获得3个信息,UID,PASSWORD,和SECQUES,这三个是DISCUZ建立COOKIE需要用的,第一个是用户ID,第二个是加密后的密码,第三个是加密后的回答问题答案(即使没有设置也要用),DISCUZ是需要提示问题和答案的,而我们登陆就不需要了,所以我这里直接把他查出来了。dsetcookie('auth','0'); 这句就是建立用户的COOKIE,别的不用说了,请注意这句'123',这个地方一定要注意,这个是加密时设置的KEY,就是你这里需要和你DISCUZ的一样,所以有三个地方一定要统一,一个是global.func.php,一个是你自己复制出来的那个authcode函数,还有就是你在使用authcode的时候。这时候论坛应该可以登陆了,如果不能登陆,请看下面 我们var_dump($_COOKIE)一下,发现显示的是:array(5) { ["eVb_cookietime"]=> string(7) "2592000" ["eVb_oldtopics"]=> string(3) "D1D" ["eVb_sid"]=> string(6) "HfxRDJ" ["eVb_auth"]=> string(68) "LSwuxyf7QECdnc+9AxgOihQvc1ScFQQsUvgnafBVrFmuHq8DlIvj57rq1PVRlJ05g1Kb" ["eVb_visitedfid"]=> string(1) "2" }(可能有不一样的地方,不用着急) 我们这里注意一下eVb_auth,其实我们的加密信息被存储到这个COOKIE里了,这里的EVB是DISCUZ默认的COOKIE前缀,如果你更改了COOIKE的话这个也会变化。 所以我们就要处理这个eVb_auth; function is_login() { if(isset($_COOKIE['eVb_auth'])){ list($discuz_pw,$discuz_secques,$discuz_uid) = isset($_COOKIE['eVb_auth']) ? explode("t",authcode($_COOKIE['eVb_auth'],'DECODE','123')) : array('',0); $discuz_pw = addslashes($discuz_pw); $discuz_secques = addslashes($discuz_secques); $discuz_uid = intval($discuz_uid); // 不存在$_DCOOKIE['auth']的话 就直接清楚COOKIE if(isset($_COOKIE['eVb_auth']) && !$discuz_uid) { clearcookies(); } if($discuz_uid){ $sql = "SELECT username ,groupid FROM cdb_members WHERE uid ='$discuz_uid'"; $rs = $this -> _db -> query($sql); $row = $this -> _db -> fetch($rs); $discuz_groupid = $row['groupid']; $discuz_username = $row['username']; return $array = array("discuz_uid"=>$discuz_uid,"discuz_groupid" => $discuz_groupid, "discuz_username" => $discuz_username); } }else{ if(isset($_COOKIE['eVb_sid'])){ $sid = $_COOKIE['eVb_sid']; $sql = "SELECT uid ,username ,groupid FROM cdb_sessions WHERE sid ='$sid'"; $rs = $this -> _db -> query($sql); $row = $this -> _db -> fetch($rs); if($row){ $discuz_groupid = $row['groupid']; $discuz_username = $row['username']; $discuz_uid = $row['uid']; return $array = array("discuz_uid"=>$discuz_uid, "discuz_username" => $discuz_username); }else{ return 0; } }else{ return 0; } } } 我们先看if(isset($_COOKIE['eVb_sid'])){前的这部分 个人感觉唯一要解释一下的就是这句:list($discuz_pw,0); 这是将EVB_AUTH解密的过程,这里用DECODE来解密,记得后面的123是你的KEY,要保持一直,不然解密不会成功的。 然后在看下半部分: DISCUZ是通过SESSION和COOKIE两种方式加密的,而他的SESSION保存在数据库中,我们下边这部分就是利用当没有$_COOKIE['eVb_auth']时,用$_COOKIE['eVb_sid']来取出信息;这不过是个数据库操作,没啥好将的,这样,通过建立和读取我们就可以取出DISCUZ的信息了。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|