2012.03.17 15:07

Cakephp 시작하기. 회원 로그인 처리하기 Auth components 이용하기. Cakephp 2.0 기준

Cakephp 를 이용하는 두번째 시간. 두번째 부터는 2.0 기준으로 버젼을 올려 보자. 어쩌다 보니 얄궂은 사이트를 하나 맞게 되었고 이런것 저런 것 고민하기 싫어서 2.0 으로 공부도 할 겸 하나 버젼을 올려봤다. 디렉토리, 파일 작명 규칙이 바뀌었다는 점만 빼면 그렇게 실감하는 바는 별로 없다. 그전에도 Cakephp 를 잘 몰랐다는 이야기만 나처럼 고생하지 않기를 바라는 마음에 나의 삽질기를 적어 놓는다. 또 언제 php 를 사용하게 될런지 몰라도 가끔은 필요한 일일테니 짧은 기억 보존을 위해서라도 흔적을 남겨놔야지 않겠나.

일단 사이트를 띄우고  Member 란 모델까지 만들었다면 Member 를 이용한 로그인 기능과 어느 페이지에서든 로그인한 사용자의 정보를 읽고 사용할 수 있는 Sesseion 에 대한 처리를 해야겠지. Cakephp  에서는 인증에 대해 세가지를 지원한다. "Form", "Basic", "Digest"... Form 이야 누구나 알든 웹페이지의 입력칸에 아이디와 패쓰워드를 넣어서 사용하는 것이고, Basic 은 윈도우 기본 인증창을 띄우는 경우이고, Digest 는 Digest Http 를 이용하는 것이란다. 여기서 살펴 볼 방법은 어느 사이트에서나 쉽게 볼 수 있는 Form 인증 방법을 살펴 보자.

Cakephp 에서는 Form 인증을 사용할 경우 Users 란 모델을 사용한다. 하지만 우리가 DB 를 만들 때 Cakephp 전용으로 만들 것도 아니고 지난 post 에서 처럼 Member 란 테이블을 이용하는 경우 인증에서 사용하려는 model 과 어떻게 매칭을 시킬 것인가하는 문제와 컬럼 명을 어떻게 맞춰 줄 것인가 하는 문제가 생긴다. Cakephp 의 Auth 를 이용하면 기타 세션에 대한 관리 및 사용자 인증 정보등을 $this->Auth 란 넘과 $this->Session 이용해서 쉽게 처리할 수 있는 건 알겠는데 지들끼리 User 란 모델과 username, password 를 써서 돌리니 이것 참 답답한 노릇이다. 난 Member 란 모델과 loginid, pwd 를 사용하고 싶은데 말이지.

Member 에 대한 처리는 지난 Post에서 다뤘으니 이제 Auth 를 다뤄보자.
제일 먼저 해야 할 일은 "app/Controller/AppController.php" 를 수정하는 일이다. 사용자가 추가하는 모든 컨트롤들이 AppController 를 상속(?) 받는 다는 점에서 매우 중요하다는 점은 알겠고 이용은 어찌하면 좋을지는 천천히 알아보자.

	public $components = array(
		'Session',
		'Auth' => array(
			'loginRedirect' => array('controller' => 'main', 'action' => 'index'),
			'logoutRedirect' => array('controller' => 'main', 'action' => 'index')
		)
	);

	public function beforeFilter() {
		// Pass settings in
		$this->Auth->authenticate = array('Form');
		$this->Auth->authenticate = array(
			'Form' => array('userModel' => 'Member', 'fields' => array('username' => 'login_id'))
		);
		$this->Auth->allow('index', 'view', 'join');
	}


주의 깊게 살펴봐야 하는 곳은 $components 의 'Auth' 부분과 beforeFilter 함수이다.
 $components 의 'Auth' 에서 배열로 추가한 값은 로그인, 로그아웃 후에 어떻게 처리 할 것인가 어디로 보낼까의 문제이다. 알아서들 처리하면 될 문제고 난 메인 페이지로 보내 버리기로 했다. 다른 요구가 있다면 또 처리하면 될 문제이고
 beforeFilter 에서 $this->Auth->authenticate 가 나오는데 이부분이 내가 처리하고자 하는 인증 방법과 그 인증 방법을 사용할 때 매칭할 모델, 컬럼 명에 대한 정보를 세팅하는 것이다. 맨 아래 $this->Auth->allow 는 인증 없이 보이게 할 페이지를 지정하는 것이다. 즐 어떤 컨트롤을 타더라도 'index', 'view', 'join' 이 세가지 액션에 대해서는 인증 없이 페이지를 보여주란 뜻이다. 특정 컨트롤에서 다른 액션을 추가하고 싶다면 beforeFilter 함수를 만들고 parent::beforeFilter(); 뒤에 $this->Auth->allow('list'); 를 추가해 주면 위의 세개에 list 가 허용 가능한 페이지로 세팅된다.
로그인 처리를 할 MemberController 에서는 아래와 같이
	public function login() {
	
		if(!empty($this->data))
		{
			if ($this->Auth->login()) {
				//$this->redirect($this->Auth->redirect());
				$this->redirect('/Users/mypage');
				// 정상적으로 로그인 되었다면 원하는 페이지로 보내자 자칫 로그인 페이지에서 무한 반복 로그인메소드 실행 후 Sessein 생긴걸 form 페이지 띄우며 다시 지우고 그냥 보기엔 뭔가 잘못되어 로그인이 않된 것 같은 그런 상태를 반복 할 수 있다. 로그인 페이지에서 로그인 한 경우는 그런 반복의 늪에 빠질 공산이 있다.
			} else {
				$this->Session->setFlash(__('아이디와 패스워드를 확인해 주세요'));
			}
		}
	}
public function logout() { $this->Auth->logout(); $this->redirect("/"); }
login.ctp 에서는 아래와 같이
				<?php echo $this->Session->flash('auth'); ?>
				<?php echo $this->Form->create('Member');?>
				<div style="padding:20px;">
					<fieldset>
						<span class="joing_in">
							<span class="item title"><span class="txt_point">*</span> <label for="login_id" class="txt_bold"> 아이디</label></span>
									<span class="item"><?php echo $this->Form->text('Member.login_id' , array('class'=>'textStyle1','MAXLENGTH'=>'16'));?></span>
									<span class="item"><span class="txt_point txt_small"></span>
							</span>
						</span>
						<span class="joing_in">
							<span class="item title"><span class="txt_point">*</span> <label for="Memail" class="txt_bold"> 비밀번호</label></span>
									<span class="item"><?php echo $this->Form->password('Member.password' , array('class'=>'textStyle1','MAXLENGTH'=>'16'));?></span>
									<span class="item"><span class="txt_point txt_small"></span>
							</span>
						</span>
						<input type="image" src="/img/button/btn_login.gif" value="로그인"/>
					</fieldset>
				</div>
				<?php echo $this->Form->end();?>
참 간단하다.  이제 Member 모델을 이용한 로그인이 가능하게되었다. 다만 아직 Member 테이블에 정보가 하나도 없으니 그냥 로그인 폼만 반복하는 좀 바보 같은 페이지가 완성되었다. 
<?php echo $this->element('sql_dump'); ?> 를 이용해서 사용되는 쿼리를 살펴보면 그 내용을 알 수 있다. 
저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 2 Comment 0


티스토리 툴바