Discuz member模块功能解析

本文详细解析了Discuz会员模块的功能,包括用户登录、注册、账号激活、忘记密码的过程。在登录时,系统进行一系列的安全验证;注册过程中涉及IP白名单、邀请码验证和用户名检查等;账号激活和忘记密码通过邮件验证,确保账户安全。
摘要由CSDN通过智能技术生成

知识点

1.ip转换成地址

discuzip装换成地址用的是离线数据,一个叫纯真IP地址数据库的数据库,存放了几乎所有ip到地址的映射,且经常有更新,可以在这个git库上下载,也可以网上搜qqwry.dat。

功能解析

discuz的member模块主管用户的登录、注册、账号激活、忘记密码和切换在线状态等功能,下面我们一一分析这些功能。排列顺序按简单到难吧。

切换在线状态

切换在线状态的实现在/source/module/member/member_switchstatus.php中。

discuz用户有在线和隐身两种状态,用户点击更改状态时,后台会在数据库及session中(如果有开启session)更新用户状态:

$_G['session']['invisible'] = $_G['session']['invisible'] ? 0 : 1;
C::app()->session->update_by_uid($_G['uid'], array('invisible' => $_G['session']['invisible']));
C::t('common_member_status')->update($_G['uid'], array('invisible' => $_G['session']['invisible']), 'UNBUFFERED');

账号激活

账号激活的实现在/source/module/member/member_emailverify.php和member_activate.php中。

discuz自带了邮件激活账号的功能,激活流程比较简单。首先用户注册完之后,系统会生成6位数的随机认证码,并且用这个码拼成一个链接指向member_activate.php,通过邮件发送给用户:

$idstring = random(6);
...
$verifyurl = "{
     $_G[siteurl]}member.php?mod=activate&uid={
     $_G[uid]}&id=$idstring";
$email_verify_message = lang('email', 'email_verify_message', array(
						'username' => $_G['member']['username'],
						'bbname' => $this->setting['bbname'],
						'siteurl' => $_G['siteurl'],
						'url' => $verifyurl
					));
sendmail("$username <$email>", lang('email', 'email_verify_subject'), $email_verify_message);

用户点击链接之后会进入激活流程,系统会验证请求的uid和认证码是否匹配,若匹配,则激活成功,系统将会更新该用户的用户组和激活状态:

if($operation == 2 && $idstring == $_GET['id']) {
   
	$newgroup = C::t('common_usergroup')->fetch_by_credits($member['credits']);
	C::t('common_member')->update($member['uid'], array('groupid' => $newgroup['groupid'], 'emailstatus' => '1'));
	C::t('common_member_field_forum')->update($member['uid'], array('authstr' => ''));
	showmessage('activate_succeed', 'index.php', array('username' => $member['username']));
} else {
   
	showmessage('activate_illegal', 'index.php');
}

从上面的代码看,激活账号没有时间限制,但是在discuz源码的其他实现中,随机认证码是有时限的,超过了时限就会失效,如下面的忘记密码功能。

忘记密码

忘记密码取回密码的实现在/source/module/member/member_lostpassword.php和member_getpassword.php中。

忘记密码取回密码的流程和账号激活的流程基本类似,先是系统随机生成一个6位的随机验证码,然后组合成一个重置密码的链接指向member_getpassword.php,通过邮件发送到用户的注册邮箱中:

$idstring = $type == 2 && $idstring ? $idstring : random(6);
...
$email_verify_message = lang('email', 'email_verify_message', array(
	'username' => $_G['member']['username'],
	'bbname' => $_G['setting']['bbname'],
	'siteurl' => $_G['siteurl'],
	'url' => $verifyurl
));
...
sendmail("{
     $_G[member][username]} <$_GET[email
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番茄大圣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值