2013-04-03 3 views
1

다음과 같은 컨트롤러가 있는데, 양식 유효성 검사와 오류 표시 측면에서 잘 작동합니다.CodeIgniter 폼 유효성 검사 오류 리디렉션

사용자가에서 로그인을 시도 :이 오류 (예상대로) 제대로 로그인보기를로드하고 표시, 사용자가 잘못된 자격 증명을 입력 할 때, 그러나 http://mydomain.com/index.php/login

제대로 "잘못된 로그인"하지만, 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의 솔루션 수정 그 문제는 이제 view를로드 할 때 check_database() 함수에서 "Invalid Login"오류 메시지 (set_message)를 표시하지 않습니다. 어떤 아이디어가 내가 여기서 잘못하고있는 것인가?

업데이트 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 암호 필드는 값을 변경할 수 있기 때문에 xss_clean 암호 필드를 사용하지 마십시오. 사용자가 완벽하게 입력 한 암호가 작동하지 않는 이유에 대해 궁금해 할 것입니다. 암호를 해싱해야 보안 문제가 해결됩니다.

+0

안녕하세요, Cryode,이 문제가 해결되었지만보기를로드 할 때 check_database() 함수에서 '잘못된 로그인'오류 메시지가 표시되지 않습니다. 어떤 아이디어? – Dodinas

+0

왜 그 기능이 멈추었을지 모르겠다.이 모든 것은 두 가지를 사용하는 대신 같은 코드를 하나의 방법으로 통합하는 것이다. 질문에 현재 코드를 추가 할 수 있습니다. –

+0

xss 및 해시에 대한 의견을 보내 주셔서 감사합니다. 그렇게 할거야. – Dodinas

관련 문제