JSON 登录认证 Zend 框架

JSON Login Authentification Zend Framework

我正在使用 ExtJS 创建表单登录,并发送 JSON 数据以在 Zend Framework 中进行身份验证。问题是,无论我填写什么用户名和密码,登录总是成功的。这是相关代码:

Ext JS 表单的提交函数,我们发送 JSON 包含用户名和密码的数据。

var doLogin = function () {
    if (formPanel.getForm().isValid()) {
        formPanel.getForm().submit({
            method: 'POST',
            url: '/zend/public/auth/valid',
            waitMsg: 'Processing Request',
            success: function (form, action) {
                document.location = '/zend/public/guestbook';
            },
            failure: function (form, action) {
                if (action.failureType = 'server') {
                    obj = Ext.util.JSON.decode(action.response.responseText);
                    Ext.Msg.alert('Login Failed', obj.errors.reason);
                } else {
                    Ext.Msg.alert('Warning!', 'Authentification server is uneachable : ' + action.response.responseText);
                }
                formPanel.getForm().reset
            }
        })
    }
}

控制器,我们有 ValidAction 函数来接收和发送 JSON 数据,并进行身份验证。

public function validAction()
{
    if(!isset($this->session->isLogin)){
        $username = mysql_escape_string($_POST['username']);
        $password = mysql_escape_string($_POST['password']);

        $formdata = array('username'=>$username, 'password'=>$password); 
        if ($this->_process($formdata)) {
            $this->session->setExpirationSeconds(3600);
            $msg = '{success:true, result:{message:\'Welcome, '.$username.'!\'}}';
        } else {
            $msg = '{success:false, errors:{reason:\'Login failed, try again.\'}}';
        }
    }

protected function _process($values) {
    // Get our authentication adapter and check credentials
    $adapter = $this->_getAuthAdapter();
    $adapter->setIdentity($values['username']);
    $adapter->setCredential($values['password']);

    $auth = Zend_Auth::getInstance();
    $result = $auth->authenticate($adapter);
    if ($result->isValid()) {
        $user = $adapter->getResultRowObject();
        $auth->getStorage()->write($user);
        return true;
    }
    return false;
}

问题出在 validAction 上,奇怪的是我对 $this->process($formdata) 做了 var_dump 和 returns false,但它总是转到 if function,消息 Success。有任何想法吗?感谢你们。

更新:

var_dump :

Uncaught Error: You're trying to decode an invalid JSON String: 
array(2) {
   ["username"]=>
   string(2) "ad"
   ["password"]=>
   string(4) "pass"
}
bool(false)
string(59) "{success:false, errors:{reason:'Login failed, try again.'}}"

后端问题

您正在输出无效 JSON。

PHP 提供 json_encode 以节省您必须手动创建 json:

$response=array();
$response['success']=false;
$response['result']=array();
$response['message']='Welcome '.$username;
$msg = json_encode($response);

如果您真的不想使用它,您应该为您的键添加双引号,并将您的字符串属性也更改为双引号:

$msg = '{"success":true, "result":{"message":"Welcome, '.$username.'!"}}';

前端问题

您正在使用成功和失败方法,但我在您的后端代码中看不到任何发送状态 header 的内容。

仅当响应 returns 具有非 200 状态代码时才会调用失败方法。因此,您可能需要将此添加到后端代码,and/or 还解码成功方法中的响应,以确保在重定向之前已将 success:true 作为 json 的一部分发送.

要在 PHP 5.4 或更高版本中发送 header:

http_response_code(401); 

在 5.3 或更早版本中你必须使用 header 方法 - 但如果你是 运行 这个版本你应该立即升级所以我不会包括一个例子。