zoukankan      html  css  js  c++  java
  • phpcms_v9 同步登陆的BUG

        今天在做项目时发现这样的一个问题,用uc集成的phpcms_v9 和discuz x2.5修改了密码没有同步。

        研究了一下phpcms_v9 sso的源码 发现是他官网存在的一个BUG,大致是这样的

       phpcmsv_9同步登陆的时候 以phpsso为同步通信的中介, 然后 通知它下面的各个应用,理论上面这样是没有错的,

       但是他业务的代码有一部分逻辑问题,就是 它登陆的时候 如果开启了uc的同步功能,uc那边把登陆以后的结果多是安装

       它文档上面的标准说明返回的,phpsso这边的业务代码他只处理了一部分uc的返回状态 。

       即 比如

      

    list($uid, $username, $password, $email) = uc_user_login($_POST['username'], $_POST['password']);
    if($uid > 0) {
        echo '登录成功';
    } elseif($uid == -1) {
        echo '用户不存在,或者被删除';
    } elseif($uid == -2) {
        echo '密码错';
    } else {
        echo '未定义';
    }

    phpsso这边只处理了 返回的结果为-1的状态,其他的几个状态没有处理 所以导致了逻辑上面的错误

     我们把项目下面的  phpsso_server/phpcms/modules/phpsso/index.php

      public function login() {  } 这个方法里面的一部分业务修改一下

    //ucenter登陆部份
                if ($this->config['ucuse']) {
                    if($uid == -1) {    //uc不存在该用户,调用注册接口注册用户
                        $uid = uc_user_register($this->username , $this->password, $userinfo['email'], $userinfo['random']);
                        if($uid >0) {
                            $this->db->update(array('ucuserid'=>$uid), array('username'=>$this->username));
                        }
                    }else if($uid==-2){
                                        exit("-2");
                                    }
                }

    增加其它几个返回值的判断。

    还要修改一个地方  大致是 350航左右 修改结果如下

    if(!empty($userinfo) ) {
                            //&& $userinfo['password'] == create_password($this->password, $userinfo['random'])
                            if($this->config['ucuse']){
                                //登录成功更新用户最近登录时间和ip
                                $this->db->update(array('lastdate'=>SYS_TIME, 'lastip'=>ip()), array('uid'=>$userinfo['uid']));
                                exit(serialize($userinfo));
                            }else{
                                if($userinfo['password'] == create_password($this->password, $userinfo['random'])){
                                    //登录成功更新用户最近登录时间和ip
                                    $this->db->update(array('lastdate'=>SYS_TIME, 'lastip'=>ip()), array('uid'=>$userinfo['uid']));
                                    exit(serialize($userinfo));
                                }else{
                                    exit('-2');
                                }
                            }
            }

    这个是增加判断 如果开启了 uc那么登陆的密码就按照uc的接口标准,否则 走的是 phpsso这边的接口。

  • 相关阅读:
    设计模式单例模式的实现方式
    Springboot,SSM框架比较,区别
    多线程系列之自己实现一个 lock 锁
    springBoot 自动配置原理自己新建一个 starter
    Hashmap 实现方式 jdk1.7 和 1.8区别
    给WPF中的DataGrid控件添加右键菜单(ContextMenu),以便用户可以显示或者隐藏DataGrid中的列,并且下次运行时依然保持上次关闭时的列的布局
    WPF XAML页面 无智能感知
    【读书笔记】排列研究排列中的代数组合学
    使用Mathematica做序列的DTFT的几个例子
    BGF bivariate generating function 双变量生成函数
  • 原文地址:https://www.cnblogs.com/jackspider/p/3077700.html
Copyright © 2011-2022 走看看