2014-10-14 6 views
-1

이 유형의 모든 질문을 확인했지만 어느 것도 저에게 적합하지 않습니다. 희망을 좀주세요. index라는 컨트롤러와 Index_model이라는 모델이 있습니다. 인덱스 컨트롤러에 사용자 로그인 및 서명 함수를 작성하고 모델에서 모든 관련 쿼리를 수행했습니다. codeigniter 콜백 함수를 제외하고는 모두 잘 작동합니다.CodeIgniter 사용자 로그인을 위해 콜백이 작동하지 않습니다.

false를 반환 할 때마다 콜백을 사용하여 사용자 로그인 정보의 유효성을 검사하려고 할 때 콜백을 제거하면 올바르게 작동합니다. 나는 내가 잘못하고있는 곳을 얻지 못하고있다. 컨트롤러와 모델에 대한 아래의 코드를 찾으십시오. 미리 감사드립니다.

컨트롤러 :

class Index extends CI_Controller{ 

    public function __construct(){ 
     parent:: __construct(); 
     $this->load->helper('url'); 
     $this->load->model('index_model'); 
    } 

    public function signin(){ 
     $this->load->helper('form'); 
     $data['title'] = "Sign In"; 
     $data['headline'] = "Sign In"; 
     $data['introduction'] = "Sign In to manage your business, clients and more!"; 
     $data['include'] = "user/signin"; 
     $this->load->view('template/template', $data); 
    } 

    public function login(){ 
     $this->load->helper('url'); 
     $this->load->helper('form'); 
     $this->load->library('form_validation'); 

     $this->form_validation->set_rules('username', 'Username', 'required|callback_validate_login'); 
     $this->form_validation->set_rules('password', 'Password', 'required|md5'); 

     if($this->form_validation->run() == TRUE){ 
      $data['msg'] = "User Login Successfully!!"; 
      $this->load->view('user/home', $data); 
     }else{ 
      $this->signin(); 
     } 

    } 

    public function validate_login(){ 
     $this->load->library('form_validation'); 

     $result = $this->index_model->validate_user(); 
     if($result == TRUE){ 
      return TRUE; 
     }else{ 
      $this->form_validation->set_message('validate_login', 'Incorrect username/password.'); 
      return FALSE; 
     } 
    } 
} 

모델 :

class Index_model extends CI_Model{ 
    public function __construct(){ 
     $this->load->database(); 
    } 

    /******User Login*************/ 
    public function validate_user(){ 
     $username = $this->input->post('username'); 
     $password = $this->input->post('password'); 

     $this->db->where('username', $username); 
     $this->db->where('password', $password); 
     $query = $this->db->get('user'); 

     if($query->num_rows() == 1){ 
      return TRUE; 
     }else{ 
      return FALSE; 
     } 
    } 
} 

, 그것은 큰 도움이 될 것입니다 내 코드를 검토하십시오.

+0

를 저장하는 validate_user 기능에서 데이터베이스 테이블 필드

일치하는 경우 MD5 함수를 추가 코드에 몇 가지 변경 원시 암호 ????? –

+0

validate_user() 함수가 반환하는 값 –

+0

validate_user 사용자 이름과 암호가있는 사용자가 데이터베이스에 존재하는지 확인합니다. $ username과 $ password는 POST 데이터로 구성됩니다. –

답변

0

콜백 (이 경우 사용자 이름)을 사용하여 함수에 전달할 매개 변수를 가져와야합니다. 그래서 여기에 코드를 변경 :

public function validate_login($username){ # get the parameter 
    $this->load->library('form_validation'); # you do not need this line here 

    $result = $this->index_model->validate_user($username); #chek the parameter 
    if($result == TRUE){ 
     return TRUE; 
    }else{ 
     $this->form_validation->set_message('validate_login', 'Incorrect username/password.'); 
     return FALSE; 
    } 
} 
+0

왜 validate_login에 사용자 이름을 전달해야합니까? 이 함수는 모델에 기록 된 validate_user 함수를 기반으로 true 또는 false를 반환합니다. validate_login에서 변수를 전달한 특별한 이유가 있습니까?이유를 알기가 어렵 기 때문에 설명하면 좋을 것입니다. –

+0

예, 콜백 함수 내에 인코딩되어 있습니다. 유효성 검사 대상 필드의 값을 프로세스의 콜백 함수에 전달합니다! https://ellislab.com/codeigniter/user-guide/libraries/form_validation.html – goseo

+0

하지만 정적 데이터로 필드의 유효성을 검사하지 않을 것입니다. 내 관심사는 모델에서 작성한 함수를 사용하여 사용자 이름과 암호의 유효성을 검사하는 것입니다. 또한 코드에서 볼 수 있습니다 –

0

당신이 암호를 검증 한 후 md5로 변환됩니다

$this->form_validation->set_rules('password', 'Password', 'required|md5'); 

콜백 프로세스에서 실행되지 않고 사용했다

$this->db->where('password', md5($password)); 
/* you should use md5($password) instead of just $password since you are using md5 as hashing technique */ 

사용해야합니다

$this->form_validation->run() //i.e. after this 

참고 : md5는 지금은 안전하지 않습니다. 무지개 테이블 공격에주의하십시오. 해싱 기술을 더 잘 변경하십시오. & 암호 해싱과 관련하여 많은 의문점이 있습니다.

0

그냥

$this->form_validation->set_rules('password', 'Password', 'required|md5'); 

여기에서 MD5를 제거하고 암호를 사용하여

$this->db->where('password', md5($password));