繁体   English   中英

使用Cakephp和PhoneGap进行身份验证

[英]Authentication using Cakephp and PhoneGap

我正在使用在服务器端使用Cakephp在客户端使用PhoneGap的应用程序,并且使用JSON作为访问服务器端的中介。

现在,我正在专门处理一个登录表单,用户需要在其中输入他/她的用户名和密码。 我将以下内容放入controller中:

public function api_login() {

    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Headers: Authorization");

    if ($this->request->data && isset($this->request->data['username']) && isset($this->request->data['password'])) {
        $arrUser = $this->User->find('all',array(
            'conditions'=>array(
                'username'=> $this->request->data['username'],
                'password' => $this->request->data['password']
            )
        ));

        if (count($arrUser) > 0 ) {
            $this->Session->write('Auth.User',$arrUser[0]['User']);
            $arrReturn['status'] = 'SUCCESS';
            $arrReturn['data'] = array('loginSuccess' => 1,'user_id' => $arrUser[0]['User']['id'] );

        }
        else {
            $arrReturn['status'] = 'NOTLOGGEDIN';
            $arrReturn['data'] = array( 'loginSuccess' => 0 );
        }
    } else {
        $arrReturn['status'] = 'NOTLOGGEDIN';
        $arrReturn['data'] = array( 'loginSuccess' => 0 );
    }
    echo json_encode($arrReturn);
}

在客户端,我正在检索JSON编码如下:

<script>
    $(document).ready(function(){
        $('form').on('submit',function(e){
            e.preventDefault();
            $username = $("#form-username").val();
            $password = $("#form-password").val();
            $.ajax({
                url : "http://localhost/teslaphonegap_cakephp/" + 'login.json',
                cache : false,
                data : {
                    'username' : $username,
                    'password' : $password },
                dataType : 'json',
                type : 'POST',
                success : function(result) {

                    if(result.status=="SUCCESS"){
                        alert("success");
                        console.log(result);
                    }else{

                        alert("username or pass are wrong");
                        console.log(result);
                    } },
                error : function(xhr, status, err) {
                    alert("ERROR");
                }
            });
        });
    });
</script>

在我的Model我使用beforeSave()来哈希密码,然后才在数据库的最开始添加密码:

public function beforeSave($options = array()) {

    $value=$this->data['User']['password'];
    $encrypted = Security::encrypt($value, Configure::read('Security.cipherCriptKey'));
    $this->data['User']['password'] = $encrypted;
    return true;
} 

现在,当我尝试登录时,它总是返回错误消息,因为它会将未散列的值与数据库中已经散列的其他值进行比较。 我该如何解决这个问题? 我使用了afterFind()但是没有用:

public function afterFind($results, $primary = false) {

    foreach ($results as $key => $val) {            
        if(isset($val['User']['password'])){
            $results['User']['password'] = Security::decrypt($val['User']['password'], Configure::read('Security.cipherCriptKey'));
        }
        return $results;
    }        
}

-编辑

在我的core.php我使用了以下内容:

    Configure::write('Security.cipherCriptKey','su0HKssPmdbwgK6LdQLqzp0Y7zOmyaTI');

首先,您的afterFind()回调无法按预期工作。

线

        $results['User']['password'] = Security::decrypt($val['User']['password'], Configure::read('Security.cipherCriptKey'));

应该写成

        $results[$key]['User']['password'] = Security::decrypt($val['User']['password'], Configure::read('Security.cipherCriptKey'));

但是,更改此设置将无法解决您的问题。 如果您在数据库中搜索密码与$this->request->data['password']匹配的记录,则不会返回任何结果。 请注意,数据库中的密码是散列的。

您必须从与$this->request->data['username']匹配的表users中获取记录,解密字段password的值,并将其与$this->request->data['password']

afterFind()已经处理了解密,因此您的代码可以编写如下:

if ($this->request->data && isset($this->request->data['username']) && isset($this->request->data['password'])) {
    $arrUser = $this->User->find('first',array(
        'conditions'=>array(
            'username'=> $this->request->data['username'],
        )
    ));

    if ($this->request->data['password'] == $arrUser['User']['password']) { 
        $this->Session->write('Auth.User',$arrUser['User']);
        $arrReturn['status'] = 'SUCCESS';
        $arrReturn['data'] = array('loginSuccess' => 1,'user_id' => $arrUser['User']['id'] );
        //rest of your code

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM