Pergunta

I've been following this tutorial by phpacademy on OOP Login and Register functions and I cant seem to be able to get the remember me function to work. I think the problem is that $user-> login(); doesnt pass any data but i cant seem to be able to fix it.

and here is a part of my init.php

if (Cookie::exists(Config::get('remember/cookie_name')) && !Session::exists(Config::get('session/session_name'))) {
$hash = Cookie::get(Config::get('remember/cookie_name'));
$hashCheck = DB::getInstance()->get('users_session', array('hash', '=', $hash));

if ($hashCheck->count()) {
    $user = new User($hashCheck->first()->user_id);
    $user-> login();
}

}

this is my User.php file

public function login($username = null, $password= null, $remember = false) {

    if (!$username && !$password  && $this->exists()) { 

//problematic if statement removing $this->exists() gives me the error  'Trying to get property of non-object'
        Session::put($this->_sessionName, $this->data()->id);

    } else {
        $user = $this->find($username);

        if ($user) {
            if ($this->data()->password === Hash::make($password, $this->data()->salt)) {
                Session::put($this->_sessionName, $this->data()->id);

                if ($remember) {
                    $hash = Hash::unique();
                    $hashCheck = $this->_db->get('users_session', array('user_id', '=', $this->data()->id));

                    if (!$hashCheck->count()) {
                        $this->_db->insert('users_session', array(
                            'user_id' => $this->data()->id,
                            'hash' => $hash
                        ));
                    } else {
                        $hash = $hashCheck->first()->hash;
                    }

                    Cookie::put($this->_cookieName, $hash, Config::get('remember/cookie_expiry'));
                }

                return true;
            }
        }
    }

    return false;
}

public function exists() {
    return (!empty($this->_data)) ? true : false;
}
Foi útil?

Solução

These (partial)files work for me:

init.php:

if(Cookie::exists(Config::get('remember/cookie_name')) && !Session::exists(Config::get('session/session_name'))) {
    $hash = Cookie::get(Config::get('remember/cookie_name'));
    $hashCheck = DB::getInstance()->get('users_session', array('hash', '=', $hash));

    if($hashCheck->count()) {
        $user = new User($hashCheck->first()->user_id);
        $user->login();
    }
}

User.php: (the complete file I have)

<?php
    class User {
        private $_db,
                $_data,
                $_sessionName,
                $_cookieName,
                $_isLoggedIn;

        public function __construct($user = null) {
            $this->_db = DB::getInstance();

            $this->_sessionName = Config::get('session/session_name');
            $this->_cookieName = Config::get('remember/cookie_name');

            if(!$user) {
                if(Session::exists($this->_sessionName)) {
                    $user = Session::get($this->_sessionName);

                    if($this->find($user)) {
                        $this->_isLoggedIn = true;
                    } else {

                    }
                }
            } else {
                $this->find($user);
            }
        }

        public function update ($fields = array(), $id = null) {
            if(!$id && $this->isLoggedIn()) {
                $id = $this->data()->id;
            }

            if(!$this->_db->update('users', $id, $fields)) {
                throw new Exception('There was a problem updating');
            }
        }

        public function create($fields) {
            if(!$this->_db->insert('users', $fields)) {
                throw new Exception('There was a problem creating an account');
            }
        }
        public function find($user = null) {
            if($user) {
                $field = (is_numeric($user)) ? 'id' : 'username';
                $data = $this->_db->get('users', array($field, '=', $user));

                if($data->count()) {
                    $this->_data = $data->first();
                    return true;
                }
            }
            return false;
        }

        public function login($username = null, $password = null, $remember = false) {

            if(!$username && !$password && $this->exists()) {
                Session::put($this->_sessionName, $this->data()->id);
            } else {
                $user = $this->find($username);

                if($user) {
                    if($this->data()->password === Hash::make($password, $this->data()->salt)) {
                        Session::put($this->_sessionName, $this->data()->id);

                        if($remember) {
                            $hash = Hash::unique();
                            $hashCheck = $this->_db->get('users_session', array('user_id', '=', $this->data()->id));

                            if(!$hashCheck->count()) {
                                $this->_db->insert('users_session', array(
                                    'user_id' => $this->data()->id,
                                    'hash' => $hash
                                ));
                            } else {
                                $hash = $hashCheck->first()->hash;
                            }

                            Cookie::put($this->_cookieName, $hash, Config::get('remember/cookie_expiry'));
                        }

                    return true;
                    }
                }
            }
            return false;
        }

        public function hasPermission($key) {
            $group = $this->_db->get('groups', array('id', '=', $this->data()->group));

            if($group->count()) {
                $permissions = json_decode($group->first()->permissions, true);

                if($permissions[$key] == true) {
                    return true;
                }
            }
            return false;
        }

        public function exists() {
            return (!empty($this->_data)) ? true : false;
        }

        public function logout() {
            $this->_db->delete('users_session', array('user_id', '=', $this->data()->id));
            Session::delete($this->_sessionName);
            Cookie::delete($this->_cookieName);
        }

        public function data() {
            return $this->_data;
        }

        public function isLoggedIn() {
            return $this->_isLoggedIn;
        }
    }
?>

Outras dicas

Maybe you are reading and setting different cookie. Change:

Cookie::put($this->_cookieName, $hash, Config::get('remember/cookie_expiry'));

To:

Cookie::put(Config::get('remember/cookie_name'), $hash, Config::get('remember/cookie_expiry'));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top