一个系统允许同一个帐号最多10个人同时登录在线,怎么做呢?说说大家的思路。。

解决方案 »

  1.   

    不同的sessionid对应同一个帐号,存内存表怎么样?
    userid | sessionid
      

  2.   

    貌似也只有这样了,不过应该再增加个字段记录最后刷新的时间,每次有登陆请求时,清除15分钟没有活动的session,然后查询userid的活动sessionid数是否超过10个,超过不允许登陆(或者踢出最早没有活动的sessionid,这个要看实际需求,是踢出先登陆的还是限制后登陆的)
      

  3.   

    是内部系统么。建一个表logs表
    ip  user_id  last_time假设10分钟内算为在线
    WHERE last_time+600 > time() 加 GROUP BY user_id 大于10个的话就不允许登录咯。
    last_time+600 < time()的删掉。具体还得实践测试……
      

  4.   

     我觉得这种要求有点妖,以sessionid来区别不同账号!那么以什么来区别不同用户呢?难道以cookie?
      

  5.   

    我们知道在单点登陆的情况下,是以session为判断依据的,那么如果单账号如何去细分出10个单账号的10个不同用户呢?在数据库里,也许不同账号有不同的USER_ID,但是同一账号也要细分不同的USER_ID吗?如果要实现效果一定要这么做吗?
      

  6.   

    登陆是登陆,限制是限制。一个登陆一个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~~~~
      

  7.   


    表少了一列:你原先的表是: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。
      

  8.   

    定制你的session handler即可,好处是不需要改动其它地方的代码
    http://ca3.php.net/manual/en/class.sessionhandler.php
    当然某些楼上的方法也都可以做到看你自己的具体需求和现有实现而定
      

  9.   

    以COOKIE做标准,很容易存在欺骗性质,如果我伪装COOKIE呢?那又当如何?
      

  10.   

    登录的时候,记录一下。然后统计。以3分钟为限。超过3分钟没有动过的。自动sign off。
      

  11.   


    看过这个session handler,不知道过期会不会回调destroy callback,只好去试验一下了。这不是伪装COOKIE的问题,如果一个攻击者连用户的账号密码都知道了,他登陆10次你又耐他何。
      

  12.   

    不知道  用 memcache来实现会不会跟简单些啊,以账号为key值,登录成功了之后,将之++,每次登录之前先判断这个对应的保存在memcache中的值是否存在!还是已近到达极限了!
      

  13.   


       我不知道版主何以提出这样的疑问?
       
       大家可以拿一些开源的论坛或CMS测试一下,是否真的一个系统只允许同一个帐号被登录一次呢?
       
       我想开源系统都做不到的,我不知道这里有几个人能完整回答出来!
      

  14.   

    ci自带的session类很好的解决了这个问题。我将session数据写入数据库。通过判断数据库中同一个user_id的在线人数就行了。