筆者是寫Java的,以前也沒碰過PHP和Discuz,在整合登陸的時候碰到了很多坑,在這裏記錄下php
具體代碼和邏輯見一下鏈接 http://www.cnblogs.com/netWild/archive/2013/06/28/3161164.htmlhtml
使用上面連接中的Demo時,在第一次調用的時候會卡上2分鐘左右,控制檯打印如下信息: Creation of SecureRandom instance for session ID generation using [SHA1PRNG]took [xx] milliseconds前端
有兩種解決辦法:java
1)在Tomcat環境中解決 能夠經過配置JRE使用非阻塞的Entropy Source。 在catalina.sh中加入這麼一行:-Djava.security.egd=file:/dev/./urandom 便可。 加入後再啓動Tomcat,整個啓動耗時降低到Server startup in 2912 ms。數據庫
2)在JVM環境中解決 打開$JAVA_PATH/jre/lib/security/java.security這個文件,找到下面的內容: securerandom.source=file:/dev/urandom 替換成 securerandom.source=file:/dev/./urandom後端
參考鏈接:http://blog.csdn.net/trackal/article/details/52597645api
查看網頁源碼,發現script請求地址爲127.0.0.1 跨域
解決方法: 進入UCenter中,在應用管理中將Discuz的訪問路徑配置爲論壇訪問地址 cookie
雖然顯示空白頁,可是登陸狀態已經同步到Discuz了,只須要刷新下Discuz頁面便可。 這裏我的的解決方法是: 第一種方法:當調用Discuz登陸接口返回script字符串後,在後端手動處理,添加一段跳轉JS,這樣頁面會自動跳轉到目標地址。session
第二種方法:本質上Discuz就是經過script標籤的跨域性來請求目標接口實現傳遞登陸狀態,能夠在後端截取該url,返回給前端,由前端處理。
由於經過同步註冊接口進行註冊的用戶沒有激活,因此須要手動在Discuz登陸一次激活,同步登陸纔會生效。
這樣設置後,只是在Discuz登陸的時候不須要手動輸入驗證碼來激活,但上面的問題尚未解決。
//打開discuz/api/uc.php //synlogin方法(180行)處,往下找到 if(($member = getuserbyuid($uid, 1))) { dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime); } //改成 if(($member = getuserbyuid($uid, 1))) { dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime); } else { if(!function_exists('uc_get_user')) { loaducenter(); } $user = uc_get_user($uid, 1); if($user) { $time = time(); DB::query("REPLACE INTO ".DB::table('common_member')." SET `uid`='{$user[0]}' , `username`='{$user[1]}' , `password`='".md5(random(10))."' , `email`='{$user[2]}' , `adminid`='0' , `groupid`='10' , `regdate`='{$time}' , `emailstatus`='0' , `credits`='0' , `timeoffset`='9999'"); DB::query("REPLACE INTO ".DB::table('common_member_status')." SET `uid`='{$user[0]}' , `regip`='{$_G['clientip']}' , `lastip`='{$_G['clientip']}' , `lastvisit`='{$time}' , `lastactivity`='' , `lastpost`='0' , `lastsendmail`='0'"); DB::query("REPLACE INTO ".DB::table('common_member_count')." SET `uid`='{$user[0]}' , `extcredits1`='0' , `extcredits2`='0' , `extcredits3`='0' , `extcredits4`='0' , `extcredits5`='0' , `extcredits6`='0' , `extcredits7`='0' , `extcredits8`='0'"); DB::query("REPLACE INTO ".DB::table('common_member_profile')." SET `uid`='{$user[0]}'"); DB::query("REPLACE INTO ".DB::table('common_member_field_forum')." SET `uid`='{$user[0]}'"); DB::query("REPLACE INTO ".DB::table('common_member_field_home')." SET `uid`='{$user[0]}'"); DB::query("UPDATE ".DB::table('common_stat')." SET `register`=`register`+1 WHERE `daytime` = '".date('Ymd', $time)."'"); if(($member = getuserbyuid($uid, 1))) { dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime); } } }
修改完後,同步註冊後就會直接激活了,如今調用同步登陸後就能直接同步登陸狀態了。
參考鏈接:http://blog.csdn.net/dongsg11200/article/details/24609783
多程序整合 UCenter,在新用戶首次註冊後是沒有同步登陸到其它程序的,也就是說用戶得在其它程序用密碼再登陸一次,之後才能同步登陸,還有就是用戶不是在 Discuz 程序註冊的話,在 Discuz 登陸時得手動激活,這些都致使用戶體驗很很差,不過解決方法很簡單~ 修改各個程序目錄下的 ./uc_client/model/user.php 文件,大概在 129 行處的 function add_user 函數裏添加代碼 如 Discuz X 的:多程序整合 UCenter,在新用戶首次註冊後是沒有同步登陸到其它程序的,也就是說用戶得在其它程序用密碼再登陸一次,之後才能同步登陸,還有就是用戶不是在 Discuz 程序註冊的話,在 Discuz 登陸時得手動激活,這些都致使用戶體驗很很差,不過解決方法很簡單~ 修改各個程序目錄下的 ./uc_client/model/user.php 文件,大概在 129 行處的 function add_user 函數裏添加代碼 如 Discuz X 的: Discuz 的參數比較多,
dbname
是數據庫名,.pre_ 是表前綴,按本身的狀況修改
$this->db->query("INSERT INTO `dbname`.pre_common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."', credits='0', timeoffset='9999'"); $this->db->query("INSERT INTO `dbname`.pre_common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."', lastactivity='".$this->base->time."', lastpost='0', lastsendmail='0'"); $this->db->query("INSERT INTO `dbname`.pre_common_member_profile SET uid='$uid'"); $this->db->query("INSERT INTO `dbname`.pre_common_member_field_forum SET uid='$uid'"); $this->db->query("INSERT INTO `dbname`.pre_common_member_field_home SET uid='$uid'"); $this->db->query("INSERT INTO `dbname`.pre_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0', extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0', extcredits7='0', extcredits8='0'");
個人是Discuz3.4,按照這種方法修改後並無效果,多是版本不一樣?。
參考鏈接:http://blog.csdn.net/iastro/article/details/52587643 參考鏈接2:https://www.cnblogs.com/seaning/p/3993068.html