社区
基础编程
帖子详情
一个系统允许同一个帐号最多10个人同时登录在线,怎么做呢?
igaojie
2012-05-09 09:46:53
一个系统允许同一个帐号最多10个人同时登录在线,怎么做呢?说说大家的思路。。
...全文
852
17
打赏
收藏
一个系统允许同一个帐号最多10个人同时登录在线,怎么做呢?
一个系统允许同一个帐号最多10个人同时登录在线,怎么做呢?说说大家的思路。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
php 同时
登录
怎么办,
一个
系统
允许
同
一个
帐号
最多
10个
人同时
登录
在线
,如何
做
呢...
一个
系统
允许
同
一个
帐号
最多
10个
人同时
登录
在线
,怎么
做
呢?
一个
系统
允许
同
一个
帐号
最多
10个
人同时
登录
在线
,怎么
做
呢?说说大家的思路。。------解决方案--------------------是内部
系统
么。建
一个
表logs表ip user_id last_time假设10分钟内算为
在线
WHERE last_time+600 > time() 加 GROUP BY user_id 大于1...
如何保证同
一个
账号同时只能在
一个
设备
登录
,账号自动
登录
相信很多人在移动开发中都会遇到这样的需求,当手机端的
一个
账号已经
登录
的情况下,限制这个账号在另
一个
设备上同时
登录
;账号自动
登录
。其实要
做
到这个的方法有很多,在这里我说下目前使用
最多
的一种方法: 在开发的时候,和后台协商定义
一个
token字段,在每次通过输入账号密码
登录
的情况下,后台生成
一个
token(一般为字符串)保存在数据库或其他方式,并返回给客户端,客户端接收后保存在本地(可以是数据库,也可
springboot+shiro控制同一用户
在线
的并发数,同
一个
用户最大的会话数,默认1;比如2的意思是同
一个
用户
允许
最多
同时两个人
登录
springboot+shiro控制同一用户
在线
的并发数,同
一个
用户最大的会话数,默认1;比如2的意思是同
一个
用户
允许
最多
同时两个人
登录
。具体实现类粘贴到了下方,有需要的直接复制使用即可。ShiroLoginFilter 类,
登录
拦截器。ShiroConfig 配置类。UserRealm 类。
一个
用户账号
最多
登录
n次,超过n次将第一次
登录
的用户推出(n=1 即单点
登录
)
在一般的情况下,使用单点
登录
或者控制同
一个
账号
允许
登录
的次数,我们可以用spring的安全机制,如下: 但是当我们使用自定义
登录
过滤器时,concurrency-control 将失效,我在网上也找了很多的资料想解决失效的问题,但是用了很多方法都没有解决我的问题,所以我自己写了
一个
控制程序,控制单点
登录
和指定
登录
次数,非常的灵活,使用时非常的方便,
同
一个
电脑,同
一个
浏览器上,同时登陆多个用户-java web实现同一账号同一时间只能在
一个
地方
登录
重现步骤: 1.同
一个
电脑,同
一个
浏览器上,同时登陆两个用户,都进入项目购买页面(先A,后B),然后B先提交订单,然后A再提交订单,就能重现 问题的根源在于同
一个
电脑,同
一个
浏览器上同时登陆了两个用户,应该是不
允许
网上看了很多方法,个人也看了,自己也总结了几个比较常用的: 前提都是用session监听器,对session的创建与销毁进行监听 一、在用户
登录
时保存...
基础编程
21,891
社区成员
140,346
社区内容
发帖
与我相关
我的任务
基础编程
从PHP安装配置,PHP入门,PHP基础到PHP应用
复制链接
扫一扫
分享
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章