CakePHP 인증 구성 요소가 내 비밀번호를 해시하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/617471

문제

사용 중입니다 케이크 1.2 인증 및 ACL 구성 요소.

사용자 등록 조치에서 비밀번호가 해제되지 않습니다. 구체적으로,이 표현 :

if ($this->data['User']['password'] !=
    $this->Auth->password($this->data['User']['confirm_password']))

이것은 동일한 값을 제출하더라도 True로 평가됩니다. password 그리고 confirm_password. 호출을 제거 할 때 암호가 해제되지 않았다는 것을 알고 있습니다. Auth->password, 표현식은 거짓으로 평가됩니다.

인증 모듈이 비밀번호를 자동으로 해시 할 것으로 예상했습니다. 내가 뭘 잘못하고 있죠?

내 견해는 다음과 같습니다.

<?php
    echo $form->create('User', array('action' => 'register'));

    echo $form->input('email',
                      array('after' => $form->error(
                        'email_unique', 'This email is already registered.')));
    echo $form->input('password');
    echo $form->input('confirm_password', array('type' => 'password'));
    echo $form->end('Register');
?>

다음은 사용자 컨트롤러의 레지스터 조치입니다.

function register(){
    if ($this->data) {
        if ($this->data['User']['password'] !=
            $this->Auth->password($this->data['User']['confirm_password'])) {

            $this->Session->setFlash(__('Password and Confirm Password must match.', true));
            $this->data['User']['password'] = '';
            $this->data['User']['confirm_password'] = '';
        }
        else{
            $this->User->create();
            if ($this->User->save($this->data)){
                $this->redirect(array('action' => 'index'), null, true);
            }
            else {
                $this->data['User']['password'] = '';
                $this->data['User']['confirm_password'] = '';
                $this->Session->setFlash(__('Some problem saving your information.', true));
            }
        }
    }
}

그리고 여기 내 것입니다 appController 내가 포함하는 곳 Auth 그리고 Acl 모듈 :

class AppController extends Controller {
    var $components = array('Acl', 'Auth');

    function beforeFilter(){
        if (isset($this->Auth)) {
            $this->Auth->allow('display');
            $this->Auth->fields =
              array(
                'username' => 'email',
                'password' => 'password');
            $this->Auth->authorize = 'actions';
        }
    }
}

내가 뭘 잘못하고 있죠?

도움이 되었습니까?

해결책

사용자 이름에 제출 된 값이 포함되어 있지 않으면 CakePHP는 암호를 해시하지 않습니다. 사용자 이름 필드를 이메일로 교체하고 있습니다. 그러나 Auth-> Fields 배열을 설정하여 해당 필드를 다시 만들었습니다. 그러나 UserController 대신 AppController에서 그렇게하고있었습니다. 그래서이 라인을 이동 :

$this->Auth->fields = array('username' => 'email', 'password' => 'password');

AppController에서 UserController로 수정했습니다.
이제 질문은 "AppController의 Auth-> Fields를 재설정 할 수없는 이유는 무엇입니까?"

다른 팁

당신은 아마 우선적입니다 AppController::beforeFilter() 당신과 함께 UsersController::beforeFilter().

"고정"하려면 그냥 넣으십시오 parent::beforeFilter() 함수의 시작 부분에서.

데이터베이스에 저장하기 전에 비밀번호를 해시해야합니다. 이 기능을 사용자 모델에 배치하십시오.

function beforeSave() {
  if(isset($this->data[$this->alias]['password']))
    $this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true);
  return true;
}

그리고 이것을 넣는 것을 잊지 마십시오 beforeFilter() 사용자 컨트롤러에게 :

if(in_array($this->action, array('register'))) {
  $this->Auth->fields = array('username' => 'email', 'password' => 'wrongfield');
}

즉, 등록 프로세스 중에 비밀번호가 해시되지 않음을 의미합니다 (레지스터 양식의 유효성 검증이 실패한 경우).

나는 당신이 찾고 있다고 생각합니다

hashPasswords ($data)

이 페이지를보십시오. 그들은 당신을 올바른 방향으로 지적해야합니다. 코어 구성 파일에서 디버깅 레벨을 변경해 볼 수도 있습니다. 0에서 3으로 변경하면 SQL 출력을 볼 수 있습니다. 도움이 될 수 있습니다.

진짜 방법

Cakephp 문제 해결

죄송합니다. 아무것도 할 수 없지만 올바른 방향을 가리 킵니다. 나는 CakePHP를 처음 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top