2013-04-03 4 views
1

У меня есть следующий контроллер, который отлично работает с точки зрения проверки формы и отображения ошибки.Ошибка проверки достоверности формы CodeIgniter

Пользователь пытается войти в систему с: http://mydomain.com/index.php/login

Однако, когда пользователь вводит неправильные учетные данные, он загружает вид входа в систему правильно (как это необходимо) и отображает сообщение об ошибке «Invalid Логин» правильно, но URI в окне браузера отображается:

http://mydomain.com/index.php/verify_login (в отличие от вышеприведенного).

Как перенаправить после неудачной проверки только ".../index.php/логин"

Вот код в вопросе:

<? 
    class Login extends CI_Controller { 

public function index() 
{ 
    $this->load->helper(array('form')); 
    $this->load->helper('url'); 
    $this->load->view('login_page'); 
} 

function verify_login() 
{ 

$this->load->model('login_model','',TRUE); 
$this->load->library('form_validation'); 
$this->form_validation->set_error_delimiters('<label class="error">', '</label>'); 
$this->form_validation->set_rules('username', 'Login', 'trim|required|xss_clean'); 
$this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database'); 

if($this->form_validation->run() == FALSE) 
{ 
//Field validation failed. User redirected to login page 
$this->index(); 
} 
else 
{ 
//Go to private area 
redirect('private_area', 'refresh'); 
} 

} 

function check_database($password) 
{ 
    //Field validation succeeded. Validate against database 
    $username = $this->input->post('username'); 

    //query the database 
    $result = $this->login_model->login($username, $password); 

    if($result) 
    { 
    $sess_array = array(); 
    foreach($result as $row) 
    { 
    $sess_array = array(
    'id' => $row->id, 
    'username' => $row->username 
    ); 
    $this->session->set_userdata('logged_in', $sess_array); 
} 
return TRUE; 
} 
else 
{ 
$this->form_validation->set_message('check_database', '<div class="alert alert-error">Invalid username or password</div>'); 
return false; 
} 
} 
} 

UPDATE: решение устраняет Cyrode в этот вопрос, но теперь он не отображает сообщение об ошибке «Недействительный вход» (set_message) из функции check_database() при загрузке представления. Любые идеи, что я делаю неправильно здесь?

UPDATE 2: Здесь вы идете:

class Login extends CI_Controller { 

public function index() 
{ 
    $this->load->helper(array('form')); 
    $this->load->helper('url'); 
    $this->load->view('login_page'); 

    $this->load->model('login_model','',TRUE); 
    $this->load->library('form_validation'); 
    $this->form_validation->set_error_delimiters('<label class="error">', '</label>'); 
    $this->form_validation->set_rules('username', 'Login', 'trim|required|xss_clean'); 
    $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database'); 

if($this->form_validation->run() == FALSE) 
    { 
    $this->load->view('login_page'); 
    } 
else 
{ 
//Go to private area 
redirect('private_area', 'refresh'); 
} 
} 

function check_database($password) 
    { 
    //Field validation succeeded. Validate against database 
    $username = $this->input->post('username'); 

    //query the database 
    $result = $this->login_model->login($username, $password); 

    if($result) 
    { 
    $sess_array = array(); 
    foreach($result as $row) 
    { 
    $sess_array = array(
    'id' => $row->id, 
    'username' => $row->username 
    ); 
    $this->session->set_userdata('logged_in', $sess_array); 
    } 
    return TRUE; 
} 
else 
{ 
    $this->form_validation->set_message('check_database', '<div class="alert alert-error">Invalid username or password</div>'); 
return false; 
    } 
} 
} 

ответ

2

Просто сделайте все ваши обработки формы в методе index().

public function index() 
{ 
    $this->load->model('login_model','',TRUE); 
    $this->load->library('form_validation'); 
    $this->load->helper('url'); 

    $this->form_validation->set_error_delimiters('<label class="error">', '</label>'); 
    $this->form_validation->set_rules('username', 'Login', 'trim|required|xss_clean'); 
    $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database'); 

    if ($this->form_validation->run() == false) 
    { 
     $this->load->view('login_page'); 
    } 
    else 
    { 
     redirect('private_area', 'refresh'); 
    } 
} 

Затем убедитесь, что действие вашей формы идет к login и не verify_login.

Кстати, не используйте поля пароля xss_clean, потому что это может изменить их значение, и вашему пользователю будет интересно задаться вопросом, почему их совершенно не введенный пароль не работает. Во всяком случае, вы должны вводить пароль, что позволит устранить проблемы безопасности.

+0

Привет, Cryode, это исправляет эту проблему, но теперь она не отображает сообщение об ошибке «Invalid Login» из функции check_database() при загрузке представления. Есть идеи? – Dodinas

+0

Я не знаю, почему эта функция была бы остановлена ​​- все это делает объединение одного и того же кода в один метод вместо использования двух. Возможно, добавьте свой текущий код в свой вопрос. –

+0

Спасибо за комментарий к xss и хешированию. Сделаю это. – Dodinas

Смежные вопросы