初心者にもわかるCodeIgniter 其の七【ユーザーログインフォーム】
ログインフォーム
まずは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.phpにsessionライブラリーの読み込みを追加してください。
//ログイン処理 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; } }
以上。
これがログインというものです。
セキュリティとか、細かいことは無視しますが、これだけ簡単にできるという事です。
次回は、メールの送信処理をやってみます。
ユーザー登録時にメールを送信したり、必須の機能ですし。