2012-09-16 11 views
14

Ho usato Auth, ma sfortunatamente, sembra che funzioni solo con Session. Voglio che se l'utente controlla la casella di controllo "Ricordami", userei Cookie e lui verrebbe loggato per 2 settimane. Non riesco a trovare nulla nel libro ufficiale e in Google ho trovato solo pochi e non ottimi post sul blog. C'è un modo per implementare questo senza riscrivere il nucleo?CakePHP mi ricordo con Auth

+2

Non sei più interessato a rispondere a questa domanda o cosa? Non hai dato feedback a nessuna delle risposte. – Hoff

+0

Si consiglia di dare un'occhiata a https://github.com/delight-im/PHP-Auth, che è sia agnostico rispetto al database che indipendente dal database. – caw

risposta

3

Ricordarsi di me non è altro che la sessione identificata con un cookie, ma la durata del cookie è impostata su infinito. Guarda Config/core.php per la durata del cookie di sessione.

+3

La durata dei cookie non è sufficiente. Dovresti anche fare in modo che le sessioni durino così a lungo sul server. – nIcO

6

Vedere questo URL penso che sia molto utile per voi.

http://lecterror.com/articles/view/cakephp-and-the-infamous-remember-me-cookie

o provare questo

function login() { 
    if ($this->Auth->user()) { 
     if (!empty($this->data) && $this->data['User']['remember_me']) { 
      $cookie = array(); 
      $cookie['username'] = $this->data['User']['username']; 
      $cookie['password'] = $this->data['User']['password']; 
      $this->Cookie->write('Auth.User', $cookie, true, COOKIE_EXPIRE); 
      unset($this->data['User']['remember_me']); 
     } 

     $this->LogDetail->Write('activity','has logged IN'); 
     $this->redirect($this->Auth->redirect()); 
    } 

    if (empty($this->data)) { 
     $cookie = $this->Cookie->read('Auth.User'); 
     if (!is_null($cookie)) { 
      if ($this->Auth->login($cookie)) { 
       $this->Session->destroy('Message.Auth'); # clear auth message, just in case we use it. 
       $this->LogDetail->Write('activity','has been authenticated via cookie and is now logged IN'); 

       $this->redirect($this->Auth->redirect()); 
      } else { 
       $this->LogDetail->Write('activity','attempted to gain access with an invalid cookie'); 
       $this->Cookie->destroy('Auth.User'); # delete invalid cookie 

       $this->Session->setFlash('Invalid cookie'); 
       $this->redirect('login'); 
      } 
     } 
    } 
} 
+8

Mi sentirei piuttosto a disagio sapendo che la mia password, anche crittografata, galleggia da qualche parte in un cookie. Penso che in tal caso, è sufficiente memorizzare il nome utente. – nIcO

48

nel controller utente:

public function beforeFilter() { 
    $this->Auth->allow(array('login', 'register')); 
    parent::beforeFilter(); 
} 

public function login() { 
    if ($this->request->is('post')) { 

     if ($this->Auth->login()) { 

      // did they select the remember me checkbox? 
      if ($this->request->data['User']['remember_me'] == 1) { 
       // remove "remember me checkbox" 
       unset($this->request->data['User']['remember_me']); 

       // hash the user's password 
       $this->request->data['User']['password'] = $this->Auth->password($this->request->data['User']['password']); 

       // write the cookie 
       $this->Cookie->write('remember_me_cookie', $this->request->data['User'], true, '2 weeks'); 
      } 

      return $this->redirect($this->Auth->redirect()); 

     } else { 
      $this->Session->setFlash(__('Username or password is incorrect.')); 
     } 
    } 

    $this->set(array(
     'title_for_layout' => 'Login' 
    )); 
} 

public function logout() { 
    // clear the cookie (if it exists) when logging out 
    $this->Cookie->delete('remember_me_cookie'); 

    return $this->redirect($this->Auth->logout()); 
} 

Nella vista login:

<h1>Login</h1> 

<?php echo $this->Form->create('User'); ?> 
    <?php echo $this->Form->input('username'); ?> 
    <?php echo $this->Form->input('password'); ?> 
    <?php echo $this->Form->checkbox('remember_me'); ?> Remember Me 
<?php echo $this->Form->end('Login'); ?> 

Nel vostro AppController:

public $components = array(
    'Session', 
    'Auth', 
    'Cookie' 
); 

public $uses = array('User'); 

public function beforeFilter() { 
    // set cookie options 
    $this->Cookie->key = 'qSI232qs*&[email protected][email protected]*(XSL#$%)[email protected][email protected]#HKis~#^'; 
    $this->Cookie->httpOnly = true; 

    if (!$this->Auth->loggedIn() && $this->Cookie->read('remember_me_cookie')) { 
     $cookie = $this->Cookie->read('remember_me_cookie'); 

     $user = $this->User->find('first', array(
      'conditions' => array(
       'User.username' => $cookie['username'], 
       'User.password' => $cookie['password'] 
      ) 
     )); 

     if ($user && !$this->Auth->login($user['User'])) { 
      $this->redirect('/users/logout'); // destroy session & cookie 
     } 
    } 
} 
+3

Mi sentirei piuttosto a disagio sapendo che la mia password, anche crittografata, galleggia da qualche parte in un cookie. Penso che in tal caso, è sufficiente memorizzare il nome utente. – nIcO

+0

Ricorda che è l'hash crittografato, salato, della tua password.Se questo ti tiene ancora al limite, la tua scommessa migliore è quella di avere un token generato casualmente per accompagnare il nome utente. Personalmente non mi baserei solo sul nome utente. – Hoff

+1

Hai ragione, in realtà l'ho capito dopo. Ma comunque, preferirei non archiviare nulla relativo alla password in un cookie. Non sono sicuro se sia una specie di allergia, ma questa idea mi dà la pelle d'oca ;-) – nIcO

0

penso che c'è da sapere sui livelli CakePHP sicurezza. Cerca di ridurre la sicurezza del tuo cakePHP. Variabili di configurazione di CakePHP documentation. Avevo scritto un blog su di esso anche molto tempo fa.

0

si può provare questo

if ($this->Auth->login()) 
     { 
      if (!empty($this->data['User']['remember'])) 
      { 
       $cookie = array(); 
       $cookie['login'] = $this->data['User']['login']; 
       $cookie['password'] = $this->data['User']['password']; 
            $cookie['language'] =$this->data['User']['language']; 
       $this->Cookie->write('Auth.projectname', $cookie, true, '+1 years');               
       unset($this->data['User']['remember']);           
0
public function admin_login() { 
     $this->layout = 'admin_login'; 
     if (count($this->Session->read("Auth.User"))) { 
      $usr = $this->Session->read("Auth.User"); 
      if ($usr['role'] == 'A' || $usr['role'] == 'RA' || $usr['role'] == 'MAfA' || $usr['role'] == 'Af' || $usr['role'] == 'FAA') 
       return $this->redirect(array('controller' => 'dashboard', 'action' => 'view')); 
     } 
     if ($this->request->is('post')) { 

      if ($this->request->data['User']['remember_me']=="1") { 
//    pr($this->request->data); 
//    die('sdd'); 


       $this->Cookie->write('username', $this->request->data['User']['username'], true, '1 year'); 
       $this->Cookie->write('password', $this->request->data['User']['password'], true, '1 year'); 
      } else { 
       $this->Cookie->destroy(); 
      } 
      /* 
      * Check if email or username is passed in form 
      */ 
      $uname = $this->request->data['User']['username']; 
      //login via email 
      if (filter_var($uname, FILTER_VALIDATE_EMAIL)) { 
       $u = $this->User->findByemail($uname); 
      } else { //login via username 
       $u = $this->User->findByusername($uname); 
      } 
      if ($u) { 
       $this->request->data['User']['username'] = $u['User']['username']; 
       /*     * * 
       * Error if user is not active 
       */ 
       if ($u['User']['user_status'] != 'active') { 
        $this->Session->setFlash(__('Sorry! Your account is not active.'), 'default', array('class' => 'alert alert-danger')); 
       } elseif ($this->Auth->login()) { //if logged in 
        $user_caps = $this->fetchCapabilitiesByRole($u['User']['role']); 
        $this->Session->write("Auth.User.privileges", array('capabilities' => $user_caps['capabilities'], 'geo_areas' => array())); 
        if ($u['User']['role'] == 'A' || $u['User']['role'] == 'RA' || $u['User']['role'] == 'Af' || $u['User']['role'] == 'MAfA' || $u['User']['role'] == 'FAA') 
         return $this->redirect(array('controller' => 'dashboard', 'action' => 'view')); 
        return $this->redirect($this->Auth->redirect()); 
       }else { //if invalid 
        $this->Session->setFlash(__('Invalid username or password.'), 'default', array('class' => 'alert alert-danger')); 
       } 
      } else {//if user does not exists 
       $this->Session->setFlash(__('User does not exists.'), 'default', array('class' => 'alert alert-danger')); 
      } 
     } 
    }