单点登录ticket在redis中存储问题
世界只因有你
世界只因有你 2017-04-24 16:00:16
0
5
942

用户通过在单点登录服务器登陆,登录成功后,单点登录服务器分配给该用户一个ticket。然后单点登录服务器将该ticket做为key,用户名做为value,存储在redis中。通过判断该key是否是有效的来判断该用户会话有效。
后续会有服务通过向单点登录服务器发送一个ticket来验证该ticket是否有效,来判断该用户是否登录了。
但是这样会有个问题,某个用户肯能不停的登录,这样单点登录服务器每次都会将该ticket存储在redis中,虽然该ticket有过期时间,但有可能在短时间内在redis中写入大量的ticket。
不知这个有什么好的解决方法吗?

世界只因有你
世界只因有你

全部回复(5)
PHPzhong

如果你说的是接口遭到恶性调用的话,就属于DDOS防护方面的了,我的回答也就不适用了。
其实你的问题只要做过这个功能的都会遇到,就是如果判断用户已经登录,说使用cookie和session的肯定是没具体做过,这里涉及的是不同浏览器登录的情况,cookie和session都是没用的。
我当时的做法是在redis中再维护一个关系:用户名-->ticket,这样就可以根据用户名找到之前的ticket,也就可以判断出用户是否重复登录了。

phpcn_u1582

个人先答一下,登陆的时候增加验证码,增加机器登录的难度。这个算一种方法,不知到是否还有其他方法?

某草草

登录以后ticket在用户端应该有记录吧 或走session或走cookie 那么退出登录时服务端拿到ticket去清空即可 或者用户重复登录时 服务端也可拿到上一次的ticket 来决定是否销毁 再一种就是以用户id为key value存ticket

Peter_Zhu

短时间内不停的登录,如果是人工操作,大可放心 redis 还不至于撑不住。

如果是 DDoS 攻击,那应该在外侧(路由器、防火墙、HTTP服务器或者你的应用程序)添加防护策略。

在应用程序中,取决于你准备如何定义这样的“异常登录”行为,例如你可以比较短期(你可以自定义时间间隔)内的登录,来源是否一致(比如用户5秒内从地球上10个不同的地方登录),当出发异常登录行为判断后,你可以根据应用的敏感程度,决定如何处置(封号?封IP?搜集证据报警:-)

淡淡烟草味

已经登陆了,为啥你还要让他再登陆呢,逻辑就有问题啊?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!