2017-02-23 18 views
1

私はExtJSでフォームログインを作成し、JSONデータを送信してZend Framework内で認証を行います。問題は、どんなユーザー名とパスワードを入力しても、ログインは常に成功するということです。関連コードは次のとおりです。JSONログイン認証Zend Framework

JSONデータにユーザー名とパスワードを含むExt JSフォームの機能を送信します。

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 
      } 
     }) 
    } 
} 

コントローラには、JSONデータを送受信するためのValidAction機能があり、認証処理を行います。

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 - >プロセス($ FORMDATA)へのvar_dumpないとfalseを返し、まだそれは常に場合機能、メッセージの成功に行きます。何か案は?感謝している人。

UPDATE:

の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.'}}" 
+0

あなたはどのバージョンのPHPを使用していますか?私はあなたのシステムがmysql_関数をサポートしているかどうか知りたいだけです。 –

+0

はい、それはPHP 5です。私は変数$も変数$の変数をダンプし、成功...これは何らかの形で問題に関連していますか? –

+0

とは言い難い。あなたのシステムがmysql_ *関数をサポートしていなかったという印象を受けました。エラー報告とそれ以上のvar_dumpsを実行して、何が通過するかどうかを調べ、入力値と比較します。 –

答えて

0

バックエンド問題

無効なJSONを出力しています。

PHPを手動でJSONを作成する必要があなたを救うためにjson_encodeを提供します。

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

あなたが本当にこれを使用したくない場合は、あなたのキーに二重引用符を追加し、あなたの文字列を二重引用符に変更する必要がありますあまりにもプロパティ:

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

フロントエンド問題

あなたは成功と失敗のメソッドを使用しているが、私はあなたのバックエンドコードで何かにそれ自体を見ることができませんステータスヘッダ。

レスポンスが200のステータスコードで返された場合にのみ失敗メソッドが呼び出されます。したがって、これをバックエンドコードに追加するか、successメソッド内のレスポンスをデコードして、成功を送ったかどうかを確認する必要があります。リダイレクトする前にjsonの一部としてtrue。 PHP 5.4以降で、ヘッダを送信するために

http_response_code(401); 
5.3で

歳以上あなたが代わりにheaderメソッドを使用する必要があります - しかし、あなたは、このバージョンを実行している場合、私は文句を言わない例が含まれるように、あなたはすぐにアップグレードする必要があります。

+0

応答コードをありがとうので、私はそれ以外の条件に入れて、var $ msgは、インデックスを表示する権利を渡す必要がありますか?渡されると、それはトリガーされる必要がありますログインは失敗しましたが、私のものは動作していないと警告されます。あなたはなにか考えはありますか? P.P.誤ったユーザ名とパスワードを使用するとmsg変数が成功したfalse –