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