初心者にもわかる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;
}
}
以上。
これがログインというものです。
セキュリティとか、細かいことは無視しますが、これだけ簡単にできるという事です。
次回は、メールの送信処理をやってみます。
ユーザー登録時にメールを送信したり、必須の機能ですし。
