#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
---------------------
---------------------
---------------------
2012-02-02 17:02:36