记一次项目中所有用户登录不成功的解决过程

周日晚上10点钟,公司监控部来电,我负责的A系统全部登录失败,失败提示:由于你循环登录,为了保证B系统的安全,已锁定你的用户名。这意味着晚上加班的那些客服们无法工作了,事情很严重。怎么办,解决吧。

介绍一下A系统登录模块的实现:B系统是其它部门开发的单点登录系统,主要功能有单点登录,统一授权等。而A系统在开发的时候,登录是通过B系统实现的。大致过程是,验证该用户是否登录,如果未登录,则转到B系统实现登录。登录成功后,B系统返回给A系统一个token,A系统拿到这个token去B系统验证,如果验证成功,则用户在A系统登录成功(一般的单点登录都是这么做的)。B系统在实现单点登录的时候,为了防止其它系统在接入它的时候,由于程序逻辑错误,循环登录的情况,实现了一个防循环登录的功能。如果用户在1分钟登录超过10次,则屏蔽此用户。

第一个想法,B系统把我们的用户屏蔽了,但什么原因导致的屏蔽的呢?原因未知,但登录这个模块已经快2个月未改动过了,先联系B系统开发人员再说。B系统开发人员告诉我,B系统现在也处于维护阶段,一直在正常的跑,好久没修改过代码了。但答应我上服务器看日志。

查看过日志,告诉我,A系统确实存在循环登录的情况,B系统把用户屏蔽了,而且屏蔽了很多的用户,有多少?大概几百个。我认识到了事情的严重性,相当于屏蔽了所有的用户。他又告诉接入B系统的另外N多个系统都在正常的跑,没有出现循环登录的情况,另外,B系统本身也是可以正常登录的。那如果屏蔽的话会屏蔽多久?一直会屏蔽。那搞毛呀,经过商量,B系统暂时不再做验证,让A系统去登录,让真正的原因出现。去掉验证之后,问题出现了,A系统一直登录B系统页面,返回A系统页面,登录B系统页面,返回A系统页面。。。。死循环了。

给我的想法是,可能是谁改动过这个模块的代码或设置了,问运维人员(在公司,所有开发人员是不允许直接接触正式环境的服务器的,只有运维可以管理),运维人员说没有动过。那就奇怪了,任何人都没动过,系统跑着跑着死掉了。先看各种配置是否有问题,登录入口,B系统分配的特定ID,验证地址。。。。登录入口不太正常,用的是老地址,但应该也可以的。先修改一下吧,这时候,遇到这种诡异的事情,只能排查了,修改之后,问题依旧。

这时候让我感觉不能再相信他们了,决定增加日志记录,去判断问题出现在哪里。加了之后发现,B系统登录正常,A系统能够拿到token,而且验证正确。但就是更新不到Session中。问题出在哪里,去google吧,关键时刻,它总能给出一些解决方案。也就在这时候,运维告诉我,突然发现磁盘空间满了,有可能是这个原因。

看一下php.ini,找到session.save_handler = files,确定Session是通过文件来保存的,这也是PHP默认的Session保存方式。现在磁盘空间满了,Session无法保存,所以所有的用户无法登录。shit!我又看不到服务器的真实环境!这是谁的原因呢?

posted @ 2010-08-09 13:50  WildWeeds  阅读(537)  评论(2编辑  收藏  举报