2012-12-11 15 views
5

Sto utilizzando gli ultimi file Ion Ion insieme all'ultima versione di CodeIgniter 2.CodeIgniter 2 e Ion Auth: modifica dell'account utente

Esiste una funzione denominata edit_user all'interno del file di controller auth.php. Questa funzione è limitato a utilizzare solo dai membri all'interno del gruppo "Admin", e qualsiasi membro Admin può modificare qualsiasi altro membro utilizzando la funzione di tramite questo URL ...

/auth/edit_user/id 

Il problema è che I don' Per visualizzare le funzioni del controller o la vista che consente a un utente regolare (non amministratore) di modificare i dettagli del proprio account, modificare .

Questa sarebbe una nuova funzione di controller Avrei bisogno di scrivere (modificare la funzione edit_user?) O è qualcosa che Ion Auth dovrebbe già fare? Se é cosi, come?

Ecco lo stock Ion Auth edit_user funzione contenuta all'interno del controller auth.php ...

function edit_user($id) 
{ 
    $this->data['title'] = "Edit User"; 

    if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()) 
    { 
     redirect('auth', 'refresh'); 
    } 

    $user = $this->ion_auth->user($id)->row(); 

    //process the phone number 
    if (isset($user->phone) && !empty($user->phone)) 
    { 
     $user->phone = explode('-', $user->phone); 
    } 

    //validate form input 
    $this->form_validation->set_rules('first_name', 'First Name', 'required|xss_clean'); 
    $this->form_validation->set_rules('last_name', 'Last Name', 'required|xss_clean'); 
    $this->form_validation->set_rules('phone1', 'First Part of Phone', 'required|xss_clean|min_length[3]|max_length[3]'); 
    $this->form_validation->set_rules('phone2', 'Second Part of Phone', 'required|xss_clean|min_length[3]|max_length[3]'); 
    $this->form_validation->set_rules('phone3', 'Third Part of Phone', 'required|xss_clean|min_length[4]|max_length[4]'); 
    $this->form_validation->set_rules('company', 'Company Name', 'required|xss_clean'); 

    if (isset($_POST) && !empty($_POST)) 
    { 
     // do we have a valid request? 
     if ($this->_valid_csrf_nonce() === FALSE || $id != $this->input->post('id')) 
     { 
      show_error('This form post did not pass our security checks.'); 
     } 

     $data = array(
      'first_name' => $this->input->post('first_name'), 
      'last_name' => $this->input->post('last_name'), 
      'company' => $this->input->post('company'), 
      'phone'  => $this->input->post('phone1') . '-' . $this->input->post('phone2') . '-' . $this->input->post('phone3'), 
     ); 

     //update the password if it was posted 
     if ($this->input->post('password')) 
     { 
      $this->form_validation->set_rules('password', 'Password', 'required|min_length[' . $this->config->item('min_password_length', 'ion_auth') . ']|max_length[' . $this->config->item('max_password_length', 'ion_auth') . ']|matches[password_confirm]'); 
      $this->form_validation->set_rules('password_confirm', 'Password Confirmation', 'required'); 

      $data['password'] = $this->input->post('password'); 
     } 

     if ($this->form_validation->run() === TRUE) 
     { 
      $this->ion_auth->update($user->id, $data); 

      //check to see if we are creating the user 
      //redirect them back to the admin page 
      $this->session->set_flashdata('message', "User Saved"); 
      redirect("auth", 'refresh'); 
     } 
    } 

    //display the edit user form 
    $this->data['csrf'] = $this->_get_csrf_nonce(); 

    //set the flash data error message if there is one 
    $this->data['message'] = (validation_errors() ? validation_errors() : ($this->ion_auth->errors() ? $this->ion_auth->errors() : $this->session->flashdata('message'))); 

    //pass the user to the view 
    $this->data['user'] = $user; 

    $this->data['first_name'] = array(
     'name' => 'first_name', 
     'id' => 'first_name', 
     'type' => 'text', 
     'value' => $this->form_validation->set_value('first_name', $user->first_name), 
    ); 
    $this->data['last_name'] = array(
     'name' => 'last_name', 
     'id' => 'last_name', 
     'type' => 'text', 
     'value' => $this->form_validation->set_value('last_name', $user->last_name), 
    ); 
    $this->data['company'] = array(
     'name' => 'company', 
     'id' => 'company', 
     'type' => 'text', 
     'value' => $this->form_validation->set_value('company', $user->company), 
    ); 
    $this->data['phone1'] = array(
     'name' => 'phone1', 
     'id' => 'phone1', 
     'type' => 'text', 
     'value' => $this->form_validation->set_value('phone1', $user->phone[0]), 
    ); 
    $this->data['phone2'] = array(
     'name' => 'phone2', 
     'id' => 'phone2', 
     'type' => 'text', 
     'value' => $this->form_validation->set_value('phone2', $user->phone[1]), 
    ); 
    $this->data['phone3'] = array(
     'name' => 'phone3', 
     'id' => 'phone3', 
     'type' => 'text', 
     'value' => $this->form_validation->set_value('phone3', $user->phone[2]), 
    ); 
    $this->data['password'] = array(
     'name' => 'password', 
     'id' => 'password', 
     'type' => 'password' 
    ); 
    $this->data['password_confirm'] = array(
     'name' => 'password_confirm', 
     'id' => 'password_confirm', 
     'type' => 'password' 
    ); 

    $this->load->view('auth/edit_user', $this->data);  
} 

risposta

4

A meno che non manchi qualcosa, ho finito con la modifica della funzione edit_user all'interno del controller auth.php come segue.

Ho cambiato questa linea, che controlla per vedere che l'utente è "non è registrato in" OR "non un admin" prima di scaricarli fuori ...

if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()) 
{ 
    redirect('auth', 'refresh'); 
} 

... in questo , che verificare che l'utente è "non è registrato in" OR ("non un admin" E "non l'utente") prima di scaricarli fuori ...

if (!$this->ion_auth->logged_in() || (!$this->ion_auth->is_admin() && !($this->ion_auth->user()->row()->id == $id))) 

Questo sembra funzionare ...

  • Admin può modificare tutti gli account
  • L'utente può modificare solo il suo proprio conto
  • e qualcuno non accesso, non può modificare qualsiasi account.

Edit: Tuttavia, l'utente ha anche accesso ai "gruppi" di impostazione e potrebbe semplicemente mettere themself nel gruppo "admin". Non bene.

Lo sviluppatore di Ion Auth si riferisce ai file che fornisce come "esempi" funzionanti. Pertanto, spetta allo sviluppatore finale modificare Auth Auth in base alle esigenze del progetto.

Per impedire all'utente di essere un "amministratore" è necessaria una semplice modifica al file di visualizzazione edit_user.php.

autenticato l'utente è già un "admin" prima di creare le caselle ...

<?php if ($this->ion_auth->is_admin()): ?> 

    // code that generates Groups checkboxes 

<?php endif ?> 

Poi avrete anche bisogno di testare a fondo e regolare, se necessario. Ad esempio, dopo aver modificato un profilo utente, verrai reindirizzato alla vista auth. Poiché l'utente non dispone dell'autorizzazione per visualizzare la vista auth, è presente un errore "deve essere un amministratore". Nel file del controller, dovrai aggiungere la logica appropriata per reindirizzare correttamente l'utente quando non è un "amministratore".

+1

Grazie per aver risposto personalmente e aver pubblicato il codice. L'ho postato come richiesta pull e ora è stato unito al repository Ion Auth. – tagawa

1

No Ion Auth non lo fa come è - è il peso abbastanza leggero. Ma non è difficile da fare e la tua sulla strada giusta, basta prendere quel metodo edit_user ed eliminare i controlli di amministrazione e fare in modo che l'utente possa modificare solo il proprio account, basta modificarlo in modo che aggiorni solo i dettagli dell'utente per il momento utente registrato.

Controllare i documenti di autenticazione ion, fare un crack e tornare con un po 'di codice in caso di problemi.

+0

Nessun problema ... sto solo cercando una risposta definitiva. L'ho modificato con successo e ho postato la mia risposta. Grazie. – Sparky

Problemi correlati