织梦网站管理系统禁止会员同一帐号多地登录

修改织梦网站管理系统PHP程序,实现禁止同一会员帐号多地登录,一般来讲就要从判断IP入手。我修改的这个原理是:会员登录后增加创建名为Only的cookie,当会员刷新页或浏览新页面时判断从数据表@_member中当前会员的loginip值md5后与Only比较异同,把此条件加在验证用户是否已经登录函数IsLogin()中,成立返回真,不成立返回假,即可实现。修改如下:

修改文件/include/memberlogin.class.php

构造函数,大约171行左右的$this->OnlyCookie = GetCookie("Only");代码下一行增加代码如下:
$this->OnlyCookie = GetCookie("Only");

验证用户是否已经登录函数IsLogin(),大约第290行 改为
function IsLogin()
{
$loginipCookie = substr(md5($this->fields['loginip']),0,16);
if($this->M_ID > 0 && $this->OnlyCookie == $loginipCookie) return TRUE;
else return FALSE;
}


重置用户信息函数ResetUser()内的最后,大约第389行左右代码DropCookie('DedeLoginTime');的下一行增加代码如下(除管理员外的cookie方法):
DropCookie('Only');
意为重置会员cookie信息

大约第530行左右保存用户cookie的函数PutLoginInfo()内的if($this->M_KeepTime > 0)内增加代码如下(除管理员外的cookie方法);
PutCookie('Only',substr(md5(GetIp()),0,16),$this->M_KeepTime);
意为增加cookie条目
下面的else内最后加上
PutCookie('Only',$this->M_LoginTime);

修改文件/include/userlogin.class.php(这个没有测试管理员的帐号效果,后来我没我修改这条,也就是说这条改不改不影响除ID为1的其他会员的禁止多地登录效果)
keepUser()函数内大约第315行增加代码如下:
PutCookie('Only', substr(md5('MrDede'.GetIp()),0,16), 3600 * 24, '/');
保持用户的会话状态,这里给管理员(id=1)增加了名为Only的cookie信息

————————–

2020-02-26 修改

2021-02-01 再次修改

因为之前修改时的说明有些笼统,说明中隐含的借用了上面的说明,逻辑也有一些问题,造成使用此方法修改的朋友不能实现单点登录的功能,在这里表示抱歉。

这次(2021-02-01)有朋友来问我为什么不能实现单点登录功能,看自己的说明,实测了一下,确实。所以,又进行了回忆、修改、添加详细说明。现在实测可用。

当时可能是因为任务匆忙,没有写详细说明,只是在心里想着,没有写出来,造成现在自己看自己的说明都看不懂。这也是对自己的一个教训,以后一定要写详细的说明

以下修改方法与以上方法无关

————————–

有朋友看到文章来找我帮着修改单点登录的功能,上面是过去的思路,随着时间的变化,对此功能的实现也有了新的想法。

因为现在的路由多是动态路由,所以靠IP来识别,就显示不严谨、不可靠了。另外,还要看用户的需求,一种需求是在同一IP下可以多设备登录,另一种需求就是即使在同一IP下也要实现单个设备登录。

新的思路(单设备登录):

1、数据表dede_member新建两个字段,token,token_time

上面SQL语句中的checkmail是表dede_member的最后一个字段,当然新字段也可以接在别的字段后,这个随自己的意。

2、在/include/memberlogin.class.php的MemberLogin类内部的最后增加方法:

3、类中增加成员变量 var $isToken = false;

4、在构造方法内引用resetToken()方法,一定要放在构造方法内的最后引用

为了尽可能是符合织梦系统的逻辑,所以选择把此验证方法加在如下位置。在开发过程中,无论怎么修改,都要尽可能的保持原信息的逻辑关系

 

5、在PutLoginInfo()方法中引用resetToken()方法,如:

 

6、修改ResetUser()方法

 

7、/member/index_do.php中,在$cfg_ml->DelCache($cfg_ml->M_ID);后添加引用$cfg_ml->resetToken(true);如:

 

8、修改登录验证的方法IsLogin(),修改如下:

 

9、前端控制:后端创建接口,验证验证登录状态;前端轮询访问接口,编写自己的逻辑。后端控制:根据实际业务编写逻辑。

简单一点说这个逻辑,就是用户每次访问,都验证签名,验证通过后创建一个新签名,把签名生成条件保存入库,同时把签名写入Cookie,如此循环。。。

 

承接各种网站开发与修改、爬虫、数据采集分析、小程序等任务

Html+Css+JS+PHP+Nodejs+Python

专治网站各种不服

一起探讨,互相学习,共同进步!有事儿您说话。

This entry was posted in PHP, 织梦 and tagged , , by 织梦先生. Bookmark the permalink.