初心者にもわかるCodeIgniter 其の七【ユーザーログインフォーム】

2017年5月16日 20:16
前回、ユーザー登録まで完成したわけですが、あとはログインフォームを作るだけ。
セッションだなんだと面倒な感じがしますが、フレームワークを使えば大したことありません。

利用できるものは有効に使っていきましょう。
この記事は最終更新日から1年以上が経過しています。

ログインフォーム

まずはPOST元であるフォームをviewに記述していきます。

application/views/index.php にフォームを追加

<div class="row">
	<div class="col-md-6">
		<div class="well bs-component">
			<?php if($my_user_id): ?>
				<fieldset>
				<legend>ログイン情報</legend>
					<div class="row mb20">
						<label class="col-lg-2 control-label">User ID</label>
						<div class="col-lg-10">
							<?php echo $my_user['user_id']; ?>
						</div>
					</div>

					<div class="row mb20">
						<label class="col-lg-2 control-label">Name</label>
						<div class="col-lg-10">
							<?php echo $my_user['name']; ?>
						</div>
					</div>
				
					<div class="row mb20">
						<label class="col-lg-2 control-label">Email</label>
						<div class="col-lg-10">
							<?php echo $my_user['mail']; ?>
						</div>
					</div>
					
					<div class="row mb20">
						<div class="col-lg-10 col-lg-offset-2">
							<a href="/post/logout/" class="btn btn-danger">ログアウト</a>
						</div>
					</div>
				</fieldset>					
			<?php else: ?>
			<form class="form-horizontal" id="form-login_user">
				<fieldset>
				<legend>ログインフォーム</legend>
					<div class="step_1">
						<div class="form-group">
							<label for="l_mail" class="col-lg-2 control-label">Email</label>
							<div class="col-lg-10">
								<input class="form-control" name="mail" id="l_mail" placeholder="Email" type="text">
								<div class="vali-item vali-mail"></div>
							</div>
						</div>
						<div class="form-group">
							<label for="l_password" class="col-lg-2 control-label">Password</label>
							<div class="col-lg-10">
								<input class="form-control" name="password" id="l_password" placeholder="Password" type="password">
								<div class="vali-item vali-password"></div>
							</div>
						</div>
						
						<div class="form-group">
							<div class="col-lg-10 col-lg-offset-2">
								<button type="button" class="btn btn-primary send-post" data-form="login_user">送信</button>
							</div>
						</div>
					</div>
					<div class="step_2">
						<h3 class="text-center"><i class="fa fa-spinner fa-pulse"></i>データ送信中</h3>
					</div>
					<div class="step_3">
						<h3 class="text-center">送信完了</h3>
					</div>								
				</fieldset>
			</form>
			<?php endif; ?>
		</div>
	</div>			
</div>

ログイン判別バリデーション

ログイン情報が正しいか否かを、form_validationを利用して判別させましょう。

先に独自バリデーションルールを作成
application/libraries/MY_Form_validation.php に以下を追加

//ログイン
function login_user($pwd) {
	$this->set_message('login_user', 'ログイン情報が正しくありません');

	$mail = $_POST["mail"];

	$user = $this->CI->All->getUserFromMail($mail);
	if(empty($user)){
		return FALSE;
	}
	
	$dbpwd = $user['password'];

	if (password_verify($pwd, $dbpwd)) {
		return TRUE;

	}else{
		// ログイン失敗
		return FALSE;
	}

}

独自バリデーションに対応したModelを追加。
application/model/All.php に以下を追加

//メールからユーザー情報を取得
public function getUserFromMail($mail) {
	$this->db->from('user');
	$this->db->where('mail', $mail);

	$query = $this->db->get();
	if ($query->num_rows() > 0){
		return $query->row_array();
	}		
}	

そしてバリデーションルールをセット。
application/config/form_validation.php に以下を追加

//ユーザー登録
'login_user' => array(
	array(
	   'field' => 'mail',
	   'label' => 'Mail',
	   'rules' => 'required|valid_email',
	),
	array(
	   'field' => 'password',
	   'label' => 'Password',
	   'rules' => 'login_user|required',
	),
),

最後にバリデーション動作をコントローラーに記述
application/controllers/Post.php に以下を追加

//Login
public function login_user(){
	if($this->input->post()){
		$json = $this->input->post("str");
		$post = $this->lib->makePost($json);
		$this->lib->postVali($post, 'login_user');
		$id = $this->lib->setLoginData($post,'user');
		$html =array($id,NULL);
		header('Content-type: application/json');
		echo json_encode($html);
	}
	exit;
}

以上でログイン判別までは完了となります。

ログインユーザーのセッション

ログインをするというのは、何かしらの基準を常にユーザーに所持させておき、それによってログインしているか否かを判別、そしてユーザー情報を付随させるということです。
そして、その紐づけとなるのがユーザーIDです。

これは主キーであり、他と重複することのない数字なので、これをセッションに保存しておけば、色々と便利だという事になります。
文字で説明してもいまいちわかりづらいので、まずは実践を。

ライブラリーにログインした時の処理と、ページにアクセスしたときのログイン判別を記述。

application/libraries/Lib.php に以下を追加
autoload.phpsessionライブラリーの読み込みを追加してください。

//ログイン処理
public function setLoginData($post=NULL) {
	$mail = $post['mail'];
	$user = $this->ci->All->getUserFromMail($mail);
	$user_id = $user['user_id'];
	$this->ci->session->set_userdata('user_id', $user_id);
	return $user_id;
}

//ログイン中ユーザーを取得
public function getLoginUser($data) {
	//ログイン認証の処理
	$user_id = $this->ci->session->userdata('user_id');
	if(!$user_id){
		//非ログイン
		$data['my_user_id'] = 0;
	}else{
		$user = $this->ci->All->getRow('user', array('user_id'=>$user_id));
		if(empty($user)){
			//ユーザーが存在しない・強制ログアウト
			$this->ci->session->unset_userdata('user_id');
			$data['my_user_id'] = 0;
		}else{
			//ログイン中データを取得
			$data['my_user'] = $user;
			$data['my_user_id'] = $user_id;
			
		}
	}
	

	return $data;
}	

あとは一番大本のCoreで毎回ログインの有無を確認して、完了になります。

application/core/MY_Controller.php を編集

class MY_Controller extends CI_Controller
{

	public $data;
	public $user_id;

    public function __construct()
    {
        parent::__construct();

		$data = array();
		$data['assets'] = base_url().'assets';
		$data['include'] = FCPATH.'application/views';
		$data['seg1'] = ($this->uri->segment('1'))? $this->uri->segment('1') : 'index';
		$data = $this->lib->getLoginUser($data);

		$this->user_id = $data['my_user_id'];
		$this->data = $data;
    }
}

以上。
これがログインというものです。
セキュリティとか、細かいことは無視しますが、これだけ簡単にできるという事です。

次回は、メールの送信処理をやってみます。
ユーザー登録時にメールを送信したり、必須の機能ですし。

参考ページ:http://sample.xn--pbku02iq0izkz.net/

ブログ運営

株式会社ちょもらんま

https://qomolangma.jp