一个系统允许同一个帐号最多10个人同时登录在线,怎么做呢?

igaojie 2012-05-09 09:46:53
一个系统允许同一个帐号最多10个人同时登录在线,怎么做呢?说说大家的思路。。
...全文
777 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
igaojie 2012-06-05
  • 打赏
  • 举报
回复
ci自带的session类很好的解决了这个问题。我将session数据写入数据库。通过判断数据库中同一个user_id的在线人数就行了。
happypiggy2010 2012-05-10
  • 打赏
  • 举报
回复
登录的时候,记录一下。然后统计。以3分钟为限。超过3分钟没有动过的。自动sign off。
kaifadi 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:

登陆是登陆,限制是限制。

一个登陆一个session,和普通的用户没有任何区别。

限制是额外的附加,每个账号一个数据库计数字段即可,问题是如何给让某个user的某个登陆过期。
用户每次都注销的话,那么操作数据库-1就好了。 用户不注销的话,那么数据库应该在session过期的同时计数-1,这样才对用户比较合理。但是很难让session的有效期和计数-……
[/Quote]
以COOKIE做标准,很容易存在欺骗性质,如果我伪装COOKIE呢?那又当如何?
kaifadi 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 8 楼 的回复:

定制你的session handler即可,好处是不需要改动其它地方的代码
http://ca3.php.net/manual/en/class.sessionhandler.php


当然某些楼上的方法也都可以做到

看你自己的具体需求和现有实现而定


看过这个session handler,不知道过期会不会回调destroy callba……
[/Quote]
恩,明白你的意思,你的方法也许可行,虽然可以固定清数据库数据,但是成本高了。而且非单服务器下有绝对控制权的才可实施。
phper530 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
如果楼主问的是 一个系统只允许同一个帐号被登录一次
你们也是这么回答吗?
[/Quote]

我不知道版主何以提出这样的疑问?

大家可以拿一些开源的论坛或CMS测试一下,是否真的一个系统只允许同一个帐号被登录一次呢?

我想开源系统都做不到的,我不知道这里有几个人能完整回答出来!
码无边 2012-05-10
  • 打赏
  • 举报
回复
限制用户名。
xuzuning 2012-05-10
  • 打赏
  • 举报
回复
如果楼主问的是 一个系统只允许同一个帐号被登录一次
你们也是这么回答吗?
libo_sina 2012-05-10
  • 打赏
  • 举报
回复
不知道 用 memcache来实现会不会跟简单些啊,以账号为key值,登录成功了之后,将之++,每次登录之前先判断这个对应的保存在memcache中的值是否存在!还是已近到达极限了!
qq120848369 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

定制你的session handler即可,好处是不需要改动其它地方的代码
http://ca3.php.net/manual/en/class.sessionhandler.php


当然某些楼上的方法也都可以做到

看你自己的具体需求和现有实现而定
[/Quote]

看过这个session handler,不知道过期会不会回调destroy callback,只好去试验一下了。


[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:

引用 6 楼 的回复:

登陆是登陆,限制是限制。

一个登陆一个session,和普通的用户没有任何区别。

限制是额外的附加,每个账号一个数据库计数字段即可,问题是如何给让某个user的某个登陆过期。
用户每次都注销的话,那么操作数据库-1就好了。 用户不注销的话,那么数据库应该在session过期的同时计数-1,这样才对用户比较合理。但是很难……
[/Quote]

这不是伪装COOKIE的问题,如果一个攻击者连用户的账号密码都知道了,他登陆10次你又耐他何。
helloyou0 2012-05-09
  • 打赏
  • 举报
回复
定制你的session handler即可,好处是不需要改动其它地方的代码
http://ca3.php.net/manual/en/class.sessionhandler.php


当然某些楼上的方法也都可以做到

看你自己的具体需求和现有实现而定





qq120848369 2012-05-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

登陆是登陆,限制是限制。

一个登陆一个session,和普通的用户没有任何区别。

限制是额外的附加,每个账号一个数据库计数字段即可,问题是如何给让某个user的某个登陆过期。
用户每次都注销的话,那么操作数据库-1就好了。 用户不注销的话,那么数据库应该在session过期的同时计数-1,这样才对用户比较合理。但是很难让session的有效期和计数-1自动的关联运行, 也就是某个登……
[/Quote]

表少了一列:

你原先的表是:

TABLE1(USER PASSWD)

增加的表示:
TABLE2 (ID USER COOKIE TIME)

用户主动注销则删除TABLE2的COOKIE即可。
用户直接关闭浏览器,则由crontab定时扫TABLE2,清理now()-TIME超过指定时间的行。

某USER登陆,检查TABLE2该USER的行数,
小于10则生成COOKIE并插入TABLE2,COOKIE返回用户。
大于10则提示不能登陆。

对于USER登陆情况,有一种情况是可以攻击服务器的,即不断的登陆但不提交COOKIE,可以迅速的占用10个该USER的登陆名额,这个问题可以为TABLE2增加IP字段进行安全过滤。即便不做这个安全策略,在crontab定时删除时也会在超时后清理掉COOKIE。

qq120848369 2012-05-09
  • 打赏
  • 举报
回复
登陆是登陆,限制是限制。

一个登陆一个session,和普通的用户没有任何区别。

限制是额外的附加,每个账号一个数据库计数字段即可,问题是如何给让某个user的某个登陆过期。
用户每次都注销的话,那么操作数据库-1就好了。 用户不注销的话,那么数据库应该在session过期的同时计数-1,这样才对用户比较合理。但是很难让session的有效期和计数-1自动的关联运行, 也就是某个登陆session过期了,而数据库里还没有-1,这对用户就不公平了。

所以,如果能够注册一个session过期的回调来操作数据库计数-1就好了,可惜不知道有没有php.ini可以配置调用个回调php文件? 估计没有。。

所以,我最终给出的方案为:用户不注销就永远保持其登陆状态,依靠一个单独的COOKIE维护。。。由crontab跑一个php定时脚本,对那些登陆状态保持超过N长的人删除其数据库的COOKIE记录并给技术-1,这样就让位其他用户了,而且原先登陆的那位同学也没话可说,只能重新试图登陆了。

增加一张表:AUTO_ID USER COOKIE, 每个USER的每个登陆点对应一个COOKIE,限制该表同一个USER的COOKIE不超过10即限制了10人登陆,只要把COOKIE生成发给每个登陆者,只要它们不注销,它们在一段时间内都保持在线,PHP检测他们是谁与否就是用查数据库里的COOKIE。为了清理那些没注销的用户,只能跑crontab定时清理了。




总结!~~~~~ 其实就是因为SESSION总会过期,过期了就无从追踪了,所以需要把会话持久化到数据库!!!
再其次,因为SESSION过期没法回调函数,所以只有持久化之后定期跑crontab清理超时COOKIE~~~~

kaifadi 2012-05-09
  • 打赏
  • 举报
回复
我们知道在单点登陆的情况下,是以session为判断依据的,那么如果单账号如何去细分出10个单账号的10个不同用户呢?在数据库里,也许不同账号有不同的USER_ID,但是同一账号也要细分不同的USER_ID吗?如果要实现效果一定要这么做吗?
kaifadi 2012-05-09
  • 打赏
  • 举报
回复
我觉得这种要求有点妖,以sessionid来区别不同账号!那么以什么来区别不同用户呢?难道以cookie?
ci1699 2012-05-09
  • 打赏
  • 举报
回复
是内部系统么。

建一个表logs表
ip user_id last_time

假设10分钟内算为在线
WHERE last_time+600 > time() 加 GROUP BY user_id 大于10个的话就不允许登录咯。
last_time+600 < time()的删掉。

具体还得实践测试……
hengyu654 2012-05-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

不同的sessionid对应同一个帐号,存内存表怎么样?
userid | sessionid
[/Quote]
貌似也只有这样了,不过应该再增加个字段记录最后刷新的时间,每次有登陆请求时,清除15分钟没有活动的session,然后查询userid的活动sessionid数是否超过10个,超过不允许登陆(或者踢出最早没有活动的sessionid,这个要看实际需求,是踢出先登陆的还是限制后登陆的)
改一下昵称 2012-05-09
  • 打赏
  • 举报
回复
不同的sessionid对应同一个帐号,存内存表怎么样?
userid | sessionid

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧