Home > Article > Backend Development > Discuz & UCenter modification notes, discuz forum_PHP tutorial
Recently, I have been reorganizing JAVA and UCENTER. Due to the needs of the project structure, I cannot completely focus on UCENTER, so during the docking process I encountered many unpleasant things. After much research, two of the big problems were finally solved, and they are now recorded for future reference.
The project does not require users to fill in their email when registering, but the UCENTER API requires that they enter their email to pass the verification. As a last resort, the UCENTER code must be modified to bypass it. The following is the changed code:
/uc_server/control/user.php line 69:
<span>1</span> <span>//</span><span> NOTE: 解决email必须填写的问题 </span><span>2</span> <span>//if(($status = $this->_check_email($email)) < 0) { </span><span>3</span> <span>// return $status; </span><span>4</span> <span>//}</span>
Since BBS blocks DISCUZ’s own registration, login, password retrieval and other operations, single sign-on must be implemented. I encountered a very annoying problem: after the account registered on the main site is synchronized to UCENTER, UCENTER will not notify other applications, which means that by default, other applications (including DISCUZ) cannot immediately register a new user. Update user list. After careful study, I found that DISCUZ synchronizes with UCENTER only during local registration, login and other events. As a result, newly registered users on the main site cannot successfully log in to the BBS through single sign-in - because this user does not exist in the BBS at all. There are two solutions. One is that the user manually logs into the BBS once, and the BBS's own mechanism will automatically synchronize the user information from UCENTER; the other is to modify the DISCUZ system code to automatically synchronize user data when a single sign-on request is made. After weighing all factors, it was decided to adopt the second option. The following is the changed code:
/api/uc.php line 192:
<span> 1</span> <span>//</span><span> NOTE 解决用户必须手工登录1次论坛的问题</span> <span> 2</span> <span>$member</span> = getuserbyuid(<span>$uid</span>, 1<span>); </span><span> 3</span> <span> 4</span> <span>if</span> (!<span>$member</span><span>) { </span><span> 5</span> <span>$init_arr</span> = <span>explode</span>(',', <span>$_G</span>['initcredits'<span>]); </span><span> 6</span> <span>$groupid</span> = <span>$_G</span>['regverify'] ? 8 : <span>$_G</span>['newusergroupid'<span>]; </span><span> 7</span> <span> 8</span> C::t('common_member')->insert(<span>$uid</span>, <span>$get</span>['username'], <span>md5</span>(random(10)), <span>$get</span>['email'], <span>$_G</span>['clientip'], <span>$groupid</span>, <span>$init_arr</span><span>); </span><span> 9</span> <span>10</span> <span>$member</span> = getuserbyuid(<span>$uid</span>, 1<span>); </span><span>11</span> <span>} </span><span>12</span> <span>13</span> <span>if</span>(<span>$member</span><span>) { </span><span>14</span> dsetcookie('auth', authcode("<span>$member</span>[password]\t<span>$member</span>[uid]", 'ENCODE'), <span>$cookietime</span><span>); </span><span>15</span> }