海洋CMS如何限制同一账号多设备登录?
结论:海洋CMS(SeaCMS)默认没有「同一账号只能一台设备登录」的开关,它的会员登录只校验账号和密码,登录成功后写 Cookie,同一账号可以在任意多台设备、任意多个浏览器上同时在线。想限制多设备登录,只能自己在会员登录逻辑上加一层校验,主流做法有两种:单点登录(后登录的把先登录的踢下线)和并发设备数限制(最多允许 2 台设备同时在线)。
海洋CMS自带多设备登录限制功能吗?
结论:不带。海洋CMS的会员体系相当轻量,数据库里通常只有账号、密码、邮箱这类基础字段,登录成功后写 Cookie 就完事,不会记录「当前有几台设备在线」。所以默认状态下,一个会员账号在手机、电脑、平板同时登录毫无障碍。
网上有些说法把「限制 IP」当成多设备限制,这是两回事。IP 限制会误伤同一个家庭 WiFi、公司 NAT 出口下的多台设备,实际体验很差,不建议用。
下面两种方案都要改动文件和数据库,动手前先备份数据库和 /member/ 目录,改坏了能回滚。
方案一:单点登录(后登录挤掉前登录)怎么做?
原理:给每个会员在数据库里存一个「当前有效登录凭证」,登录时重新生成,其他地方只要对不上就判定为被挤下线。
具体步骤:
- 给会员表(海洋CMS里一般是
sea_members或sea_user,以你站点实际表名为准)加一个字段:login_token VARCHAR(32) NOT NULL DEFAULT ''。 - 在会员登录验证通过、准备写 Cookie 的位置,生成一个随机串:
$token = md5(uniqid(mt_rand(), true));。 - 把
$token写回数据库该会员的login_token字段,同时写一份到 Cookie 里(Cookie 名自己起,比如member_token,有效期跟原有会员登录 Cookie 保持一致)。 - 在会员中心入口文件(登录后才能访问的那些页面)顶部加校验:读出 Cookie 里的 token,跟数据库里的
login_token比对,不一致就清 Cookie 并跳回登录页。 - 退出登录时,把数据库里的
login_token置空。
关键点:写库和写 Cookie 必须是同一次操作,中间不能有缓存延迟,否则会出现「刚登录就被踢」的假象。如果你的站点挂了 CDN 或页面缓存,务必把会员中心目录排除在缓存之外。
方案二:限制最多 N 台设备同时在线怎么做?
结论:用一张登录记录表来数「当前有几条有效记录」,超过阈值就删最旧的那条。
建表:
CREATE TABLE sea_member_login (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
uid INT UNSIGNED NOT NULL,
token VARCHAR(32) NOT NULL,
ip VARCHAR(45) NOT NULL,
ua VARCHAR(255) NOT NULL,
addtime INT UNSIGNED NOT NULL,
KEY uid (uid)
);
登录成功后的处理顺序:
- 先清理僵尸记录:
DELETE FROM sea_member_login WHERE addtime < UNIX_TIMESTAMP() - 604800;(604800 秒 = 7 天)。 - 统计该会员当前记录数:
SELECT COUNT(*) FROM sea_member_login WHERE uid = ?。 - 如果已到达上限(推荐设 2,手机+电脑各一台),删掉
addtime最小的那条记录,对应的那台设备下次访问会员中心时就会因为 token 查不到而被登出。 - 插入本次登录的新记录,同时把 token 写进 Cookie。
- 会员中心校验时改成:
SELECT id FROM sea_member_login WHERE uid = ? AND token = ?,查不到就登出。
把上限值做成后台可配的参数(比如 1 到 5),比写死在代码里灵活得多。
怎么验证限制真的生效了?
最省事的办法:用同一浏览器的「普通窗口 + 无痕窗口」分别登录同一账号,然后在普通窗口刷新会员中心。如果被踢回登录页,说明单点登录生效;再开第三个无痕窗口,如果第三个把第二个踢掉而第一个还活着,说明并发限制按 2 台生效。测试完记得清一次这张表的测试数据。
几个容易踩的坑
- 关闭浏览器不等于退出登录。只要 Cookie 没过期,token 依然有效,记录照样占名额,所以过期时间别设太长,86400 秒(1 天)到 604800 秒(7 天)之间取一个就行。
- 别用 UA 做唯一标识。同一款手机、同一个微信内置浏览器,UA 可能完全一样,两台设备会被判成一台。
- 移动端 App 或小程序调接口时,如果走的是独立接口而不是页面 Cookie,要把 token 放在请求头里一起校验,否则限制形同虚设。
- 改完先测退出登录。很多站点改完单点登录后,退出按钮忘了清空
login_token,导致会员退出后别人还能用同一个 token 继续访问。
总结一下:海洋CMS需要自己实现多设备限制,单点登录改动最小,只加一个字段;要精确控制设备台数就加一张登录记录表,配合过期清理和旧记录淘汰。两套逻辑可以叠加使用,先上单点登录,再按需加并发上限。
原文链接:https://www.gj0.com/thread-237.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。