说说登陆流程里发生的事情

     登陆流程做为全部系统里最经典的功能之一,表面上看也是很是简单的一件事。你能够写的很简单,只要username和password匹配下,不符合,就告诉前端匹配失败,这次登陆失败,反之成功。
   这里以解析OT的后台管理登陆流程,来分解整个登陆过程,其实登陆过程当中的N多权限判断是很是不简单的(实际上不少系统也是如此,表面上看简单的流程,简单的功能,而背后有着很复杂的逻辑)
   1.登陆的前端(输入账号和密码),post提交后,检测到有post提交,进入实例化对象。
            $User = new UserApi;
            $uid = $User->login($username, $password);
   用这种调用外部UserApi的方法,有俩个好处很是明显,能够直接调用外部的权限验证(整合的时候很是方便,实际上此处设计也是如此用意)。用户登陆能够从本地的数据库进行验证,也能够从外部的调用数据进行验证。本地有许多其余的复杂验证逻辑,封装到了该对象的内部方法里面。
   2.登陆能够选择多种方式进行登陆(好比有的网站能够邮箱登陆,也能够手机登陆)
     登陆的时候,须要对密码进行反向解密运算(帝国里运算是比较复杂的,用的是三重md5+盐的方式),通常经常使用的是md5(substr(md5($test),0,13).$salt)这种属于加密比较高的 由于盐是随机的,在不知道盐的状况下,就算知道是md5加密,也是没法进行密码破解。(弱密码加密很容易经过md5速查表反查到)
   3.验证成功后,通常须要记录用户名的行为操做(登陆成功的时候,须要记录)
   $this->updateLogin($user['id']);  $this->save($data);   
   对每次登陆  作一个uid的最近登陆时间刷新
   4.登陆成功后,会返回一个uid(这个uid是用户会员中心的uid  对接外部或者ucenter_member)  
      $Member->login($uid)  
      在UC中心user中心登陆检测到了后,同时在member表里留一份作备份,进行验证。检测其是不是有效的用户  字段status检测
   5.记录用户的登陆行为(每一个用户重要的操做,好比登陆,改写字段这种通常须要存一份做为备份)
      action_log('user_login', 'member', $uid, $uid);
    6.一样更新其在member自己表里的登陆时间,还有写session 等操做行为。
    返回,确认登陆成功,成功后,跳转到指定登陆界面
     $this->success('登陆成功!', U('Index/index'));
     这里封装了一个跳转方法。
        整个登陆流程,能够简化成一个很是经典的笔试题目,让你写个登陆流程,你会想到哪些操做。一开始笔试这个题目的时候,我直接想的觉得就是username和password进行对比,就能够完成目标。而在实际应用场景里,登陆须要注意的东西远远比这个对比复杂。
    主要涉及到的一些知识点包括:
    验证码(验证码的验证基本是必不可少的),登陆条件检测(好比限定登陆ip,频繁试错检测),登陆后密码的运算对比(这个是防止拿到了数据库,直接入侵的状况)登陆访问权限(通常后台登陆的时候,须要检测对应会员的权限)登陆后行为状态的更新(通常更新最新登陆状态,基本的会包括登陆ip,登陆时间,登陆次数)登录后session的记录(能够cookie方式,设定失效时间,通常登陆都有个失效时间)登陆的行为记录(通常做为系统管理员查看的时候使用,查看异常登陆很是有用)登陆后的页面跳转(登陆成功的跳转页面和登陆失败后的跳转页面)前端

相关文章
相关标签/搜索