2008년 11월 10일 월요일

CakePHP 1.2의 인증기능 개선하기

개인적인 공부를 목적으로 번역한 글이며 오역이 많이 있을 수 있습니다. 또한 번역 내용에 존칭은 생략했습니다.

원문 : http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/

이 글은 최근에 올렸던 퓨토리얼에(일반적인 인증 컴포넌트 기술이 아닌 예제를 몇개 포함하고 있던) 이어지는 글이다. 이 글에서는 이전에 올렸던 글에서 언급했던 것들보다 더 깊이 있게 알아보도록 하자.

 

다시 app_controller.php 를 살펴보도록 하자:

  1. class AppController extends Controller {
  2. var $components = array('Auth');
  3. function beforeFilter() {
  4. $this->Auth->allow('display');
  5. $this->Auth->loginRedirect = array('controller'=>'users', 'action'=>'index');
  6. }
  7. }

 

$this->Auth->allow('display'); 는 Auth 컴포넌트에 'display'라는 특정 액션에 대해 접근을 허락하라고 말한다. 이 액션은 Cake 의 코어에서 찾을 수 있는 Pages 콘트롤러의 일부분이다. 이 콘트롤러의 주요 목적은 정적 페이지들을 다루는 것이다. 실제 어떻게 작동하는지 살펴보려면 API를 살펴볼 수 있다. 하지만 한가지 명심해야 할 것은 'display'라는 액션이 정적 페이지들을 보여주는데 사용된다는 것이다. 만약 기본으로 허락되지 않으면 Auth는 홈페이지의 'About us' 페이지 같은 곳에 접근할 수 없게 할 것이다. 많은 경우 이것은 권장되지 않는 것이다.

$this->Auth->loginRedirect = array('controller'=>'users', 'action'=>'index'); 는 Auth 컴포넌트에 로그인 한 후에 사용자를 어디로 리다이렉팅 시켜줄지 말해준다. 기본으로 Auth는 사이트의 메인페이지로 리다이렉팅 되도록 설정되어 있다.

 

다음으로, Users 콘트롤러에서 아래 부분을 유의해서 살펴보자:

  1. if($this->action == 'add') {
  2. $this->Auth->authenticate = $this->User;
  3. }

 

$this->Auth->authenticate = $this->User; 는 Auth 컴포넌트에 hashPasswords()에 의해 제어되던 것을 오버라이딩하기 위해 User 모델 오브젝트를 사용해야 한다고 알려준다. 다시 말하면, 만약 $this->User 오브젝트에 hashPasswords() 메서드가 있으면 이것은 Auth 콘트롤러에 있는 hashPasswords() 메서드를 대신해서 사용이 된다는 의미이다. 예제에서 보는 것 처럼 이 오버라이딩은 'add' 액션에만 적용이 된다.

 

왜 이렇게 번거롭게 하는가?

 

글쎄, Auth 컴포넌트는 검증에 들어가기 전에 비밀번호를 암호화 한다는 점을 기억할 필요가 있다. 이것은 몇가지 문제를 발생시킨다. 먼저 검증 메서드가 사용자가 입력한 실제 값이 아닌 암호화된 값을(항상 길고 비어 있지 않은) 받아오기 때문에 'minLength' 와 'notEmpty' 규칙을 정확하게 적용할 수가 없다. 두번째로 만약 폼에 에러가 있다면 암호화된 값은 password 필드를 다시 차지하게 될 것이다.

 

By User 모델에 간단한 오버라이드를 만들어 줌으로 인해 작은 문제들을 피해갈 수 있다.

  1. function hashPasswords($data, $enforce=false) {

    if($enforce && isset($this->data[$this->alias]['password'])) {

    if(!empty($this->data[$this->alias]['password'])) {

    $this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true);

    }

    }

    return $data;

    }

  2.  

    function beforeSave() {

    $this->hashPasswords(null, true);

    return true;

    }

 

이익은 간단하지만 가치는 있다.:

  • 뷰를 만들때 폼 필드명이 모델이나 콘트롤러에 어떤 영향을 미칠지에 대해서 고민할 필요가 없다.
  • 검증 규칙을 적용하기 위해 'password' 필드를('passwd' 같은 다른 필드명으로 하지 않아도 된다.) 사용할 수 있다.
  • 폼 에러가 발생했을때 'password' 필드가 정리된다는 것을 믿지 않는다. 또한 'password' 를 다시 타이핑하도록 함으로 인해 'email' 필드에 실수를 한 사람을 탓할 순 없다.(?)
  • 가상 'password' 필드를 재설정/해제를 위해 콘트롤러에 코드를 추가할 필요가 없다.

위 코드를 설명하기 위해 hashPasswords()는 beforeSave() 에 true 로 설정될 $enforce 플래그가 'true'로 설정되지 않는 한 암호화를 수행하지 않을 것이다.

 

아무쪼록 도움이 되었기를 바라며 Auth에 대한 더 많은 트윅이 나왔으면 좋겠다.(Hopefully this clarifies some things and gives you some more ideas for the further tweaking of Auth…)

이 글은 스프링노트에서 작성되었습니다.

0 개의 댓글:

댓글 쓰기