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
方法 - 但如果你是 运行 这个版本你应该立即升级所以我不会包括一个例子。
我正在使用 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
方法 - 但如果你是 运行 这个版本你应该立即升级所以我不会包括一个例子。