생활코딩

Coding Everybody

코스 전체목록

닫기

리다이렉션과 로그인 개선

수업소개

현재 예제는 토픽 추가 버튼을 눌렀을 때 로그인이 필요하면 로그인을 요구한다. 로그인에 성공한 사용자를 메인 페이지로 이동시키는데 이것은 사용자가 목적하는 작업의 맥락을 흐트러트린다. 로그인 후 사용자의 원래 목적 페이지로 리다이렉션 시키는 방법을 알아본다. 

토픽 작성 동선 개선

토픽을 추가하기 위해서 '추가' 버튼을 눌렀을 때 로그인 되지 않은 사용자는 로그인 페이지로 이동을 시킨다. 로그인 후에는 글 작성 페이지로 이동하지 않고 메인 페이지로 이동하고 있는데 이 부분을 개선해보자. 

인증이 필요할 때 /auth/login 페이지로 이동시키면서 returnURL을 파라미터로 전달한다. 이 값은 로그인에 성공한 후에 페이지를 리다이렉션시키는 근거가 된다. 

/application/controllers/topic.php

function add(){

    // 로그인 필요

    // 로그인이 되어 있지 않다면 로그인 페이지로 리다이렉션

    if(!$this->session->userdata('is_login')){
        $this->load->helper('url');
        redirect('/auth/login?returnURL='.rawurlencode(site_url('/topic/add')));
    }

/application/controllers/auth.php

로그인 페이지에서 아이디/비밀번호를 입력하고 전송(submit)을 할 때 실제 인증은 /auth/authentication에서 이루어지고, 인증 후에 최종적인 페이지 리다이렉션도 /auth/authentication에서 이루어지기 때문에 /auth/authentication에 returnURL을 전달하기 위해서는 로그인 페이지의 form action 의 파라미터로 returnURL을 전달해야 한다. 아래는 이를 위한 단계이다.

function login(){
    $this->_head();
    $this->load->view('login', array('returnURL'=>$this->input->get('returnURL')));     
    $this->_footer();   
}

/application/views/login.php

</div>
<form class="form-horizontal" action="/index.php/auth/authentication<?=empty($returnURL) ? '' : '?returnURL='.rawurlencode($returnURL) ?>" method="post">
<div class="modal-body">

사용자가 로그인 버튼을 누르면 returnURL 값을 가지고 /auth/authentication 로 이동하게 된다. authentication 메소드는 사용자 인증을 시도하고, 성공했다면 전달된 returnURL로 페이지를 리다이렉션 시킨다. 

/application/controllers/auth.php

function authentication(){
    $this->load->model('user_model');
    $user = $this->user_model->getByEmail(array('email'=>$this->input->post('email')));
    if(!function_exists('password_hash')){
        $this->load->helper('password');
    }
	if(
		$this->input->post('email') == $user->email && 
        password_verify($this->input->post('password'), $user->password)
	) {
		$this->session->set_userdata('is_login', true);
		$this->load->helper('url');
        $returnURL = $this->input->get('returnURL');
        log_message('info', $returnURL);
        redirect($returnURL ? $returnURL : '/');
	} else {
		echo "불일치";
		$this->session->set_flashdata('message', '로그인에 실패 했습니다.');
		$this->load->helper('url');
		redirect('/auth/login');
	}
}

이런 방법으로 로그인 이후에 적절한 페이지로 리다이렉션을 적용하면 된다. 이것은 사용자가 로그인으로 인해서 하고자하는 일에 대한 맥락을 잃어버리지 않게 한다. 

태그

댓글

댓글 본문
버전 관리
egoing
현재 버전
선택 버전
graphittie 자세히 보기