登陆问题,居然只输入用户名就能登陆,请jake帮忙

#1 jiayan41

问题描述:
登陆直接输入正确的用户名就可以提示登陆成功,而不需要验证密码。但是当同时输入用户名和密码后才同时验证用户名和密码。
请jake看看我的代码哪儿有错误?需要同时验证用户名和密码,现在是不用输入密码,只输入正确的用户名就能登陆系统。

使用的是框架最新版本:3.1.89

index.php
---------------------
***** 以上代码省略
require(SP_PATH."/SpeedPHP.php");
import('md5password.php'); //'md5password.php'已经在框架Extensions目录中
spRun(); // SpeedPHP 3新特性
---------------------

---------------------
controller\admin.php
---------------------
// 显示用户登录框以及验证用户登录情况
public function login(){
  import("spAcl.php"); // 引入Acl文件,使得可以生成加密的密码输入框
  $userObj = spClass("lib_user"); // 实例化lib_user类
  if( $name = $this->spArgs("name") ){ // 已经提交,这里开始进行登录验证
   $password = spClass('md5password')->pwvalue();// 通过acl的pwvalue获取提交的加密密码
   // 使用spVerifier进行第一次检查
   $rows = array('name' => $name, 'password' => password);
   $results = $userObj->spVerifier($rows);
   if( false == $results ){ // 当spVerifier返回false的时候,则是表示已经通过验证,数据是合格的
    // 使用lib_user类中我们新建的userlogin方法来验证用户名和密码
    if( false == $userObj->userlogin($name, $password) ){
     // 登录失败,提示后跳转回登录页面
     $this->error("用户名/密码错误,请重新输入!", spUrl("admin","login"));
    }else{
     // 成功登录,跳转。这里要进行判断一下:
     // 如果用户角色是administrator(管理员)则跳转到admin/index的管理中心
     // 如果用户角色是visitors(普通会员)则跳转回首页
     $useracl = spClass("spAcl")->get(); // 通过acl的get可以获取到当前用户的角色标识
     if( "administrator" == $useracl ){
     //获取用户活动信息
     $logintime = spClass("lib_user");
     $uid = $_SESSION["userinfo"]["uid"];
     $conditions = array("uid"=>$uid);
     $newrow = array(
      'activated' => date("Y-m-d H:i:s"),
     );
     $logintime->update($conditions, $newrow); // 更新记录
     $this->success("登录成功,欢迎您,管理员!", spUrl("admin","index"));
     }else{
      $this->success("登录成功,欢迎您,尊敬的会员!", spUrl("admin","index"));
     }
    }
   }else{
    // $results不是false,所以没有通过验证,错误信息是$results
    foreach($results as $item){ // 开始循环错误信息的规则,这里只有用户名
     // 每一个规则,都有可能返回多个错误信息,所以这里我们也循环$item来获取多个信息
     foreach($item as $msg){
      // 虽然我们使用了循环,但是这里我们只需要第一条出错信息就行。
      // 所以取到了第一条错误信息的时候,我们使用$this->error来提示并跳转
      $this->error($msg,spUrl("admin","login"));
     }
    }
   }
  }
  // 这里是还没有填入用户名,所以将自动显示admin_login.html的登录表单
  $this->display("admin/login.html");
}
---------------------

---------------------
model\lib_user.php
---------------------
public function userlogin($name, $password){
  $conditions = array(
   'name' => $name,
   'password' => $password, // 请注意,本例中使用了加密输入框,所以这里的$password是经过MD5加密的字符串。
  );
  // dump($conditions);
  // 检查用户名/密码,由于$conditions是数组,所以SP会自动过滤SQL攻击字符以保证数据库安全。
  if( $result = $this->find($conditions) ){
   // 成功通过验证,下面开始对用户的权限进行会话设置,最后返回用户ID
   // 用户的角色存储在用户表的acl字段中
   spClass('spAcl')->set($result['acl']); // 通过spAcl类的set方法,将当前会话角色设置成该用户的角色
   $_SESSION["userinfo"] = $result; // 在SESSION中记录当前用户的信息
   return true;
  }else{
   // 找不到匹配记录,用户名或密码错误,返回false
   return false;
  }
}
---------------------

---------------------
login.html
---------------------
     
     


      
      
     


     

     


      
      <{pwinput id=mypw add="name='password' class='text-input'"}>
     


     

     


      
     


     
   

---------------------

---------------------

2012-02-02 17:02:36

#2 jake

没看出来。

你可以多用dump输出各个值,这很容易看到问题所在的。

2012-02-02 21:08:30

#3 jiayan41

已经dump好多次了,没有发现问题。

2012-02-02 21:28:37

#4 278086346

额。我就是参考你这个在做的。。。。问题解决了吗?我这是不用验证数据库,直接就能登录了。。我觉得问题出在模型里面的  if( $result = $this->find($conditions) ) 这一句,上面dump了$conditions,都是空值的。没接收填写的用户名密码,他直接就登录了。
jiayan41 你解决这个问题了啵?

2012-10-10 09:32:08

#5 278086346

还是用了JAKE的“带权限的留言本实例.rar” 解决了 。。。。
http://www.speedphp.com/thread-142-1-2.html

2012-10-10 10:05:32