2012-12-11 6 views
5

Ich bin mit den neuesten Ion Auth Dateien zusammen mit der neuesten Version von CodeIgniter 2.CodeIgniter 2 und Ion Auth - bearbeiten eigenes Benutzerkonto

Es gibt eine Funktion namens edit_user innerhalb der auth.php Controller-Datei. Diese Funktion ist eingeschränkt nur innerhalb der „Admin“ Gruppe von Mitgliedern zu verwenden, und jedes Mitglied Admin kann mit der Funktion über diese URL jedes anderes Mitglied bearbeiten ...

/auth/edit_user/id 

Das Problem ist, dass ich don‘ t Sehen Sie eine Controller-Funktion oder Ansicht, die es einem normalen (Nicht-Admin-) Benutzer ermöglicht, seine eigenen Kontodetails zu bearbeiten.

Wäre das eine neue Controller-Funktion, die ich schreiben müsste (ändern Sie edit_user Funktion?) Oder ist das etwas, das Ion Auth schon tun sollte? Wenn das so ist, wie? Hier

ist der Bestand Ion Auth edit_user Funktion enthalten im auth.php-Controller ...

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

Antwort

4

Wenn ich etwas nicht vermisse, habe ich am Ende die edit_user Funktion innerhalb der auth.php Controller wie folgt geändert.

Ich änderte diese Zeile, die, dass der Benutzer überprüft, ist OR „nicht angemeldet“ „nicht ein Admin“ bevor sie aus ... Dumping

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

... in diese , die überprüfen, um zu sehen, dass der Benutzer„nicht angemeldet“ ist OR („nicht ein Admin“ UND „nicht der Benutzer“), bevor sie aus Dumping ...

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

Dies scheint ... zu funktionieren

  • Admin kann alle Konten bearbeiten
  • Benutzer können nur sein eigenes Konto
  • und jemand nicht angemeldet bearbeiten, kein Konto bearbeiten kann.

bearbeiten: jedoch der Benutzer auch Zugriff auf die „Gruppen“ hat Einstellung und einfach themself in die Gruppe „admin“ setzen könnte. Nicht gut.

Ion Auths Entwickler bezieht sich auf die Dateien, die er als funktionierende "Beispiele" zur Verfügung stellt. Daher ist es Aufgabe des Endentwicklers, Ion Auth entsprechend den Anforderungen des Projekts zu bearbeiten.

Um zu verhindern, dass der Benutzer sich selbst zu einem "admin" machen kann, ist eine einfache Änderung an der edit_user.php Ansichtsdatei erforderlich.

Prüft der Benutzer ist bereits ein „admin“, bevor die Kontrollkästchen ... und

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

    // code that generates Groups checkboxes 

<?php endif ?> 

Dann werden Sie auch gründlich überprüft werden müssen und je nach Bedarf anzupassen. Zum Beispiel werden Sie nach der Bearbeitung eines Benutzerprofils zur Ansicht auth weitergeleitet. Da der Benutzer nicht berechtigt ist, die auth Ansicht anzuzeigen, gibt es einen Fehler "muss ein Administrator sein". In der Controller-Datei müssen Sie die entsprechende Logik hinzufügen, um den Benutzer richtig umzuleiten, wenn er kein "admin" ist.

+1

Vielen Dank für Ihre Antwort und die Veröffentlichung des Codes. Ich habe es als Pull-Request gepostet und es wurde nun in das Ion Auth-Repository eingefügt. – tagawa

1

Kein Ion Auth das nicht wie es ist tut - es ist ziemlich leicht. Aber es ist nicht schwer zu tun und Sie auf der richtigen Spur, greifen Sie einfach die edit_user Methode und nehmen Sie die Admin-Prüfungen und machen es so, dass der Benutzer nur ihr eigenes Konto bearbeiten kann, nur ändern, so dass es nur Benutzerdetails für die aktuelle aktualisiert angemeldeter Benutzer

Überprüfen Sie die Ion Auth Docs, haben Sie einen Fehler und kommen Sie mit etwas Code zurück, wenn Sie irgendwelche Probleme haben.

+0

Keine Probleme ... nur auf der Suche nach einer schlüssigen Antwort. Ich habe es erfolgreich modifiziert und meine Antwort gepostet. Vielen Dank. – Sparky

Verwandte Themen