codeigniterとsimpleloginで作る簡単認証管理

phpのフレームワークcodeigniterとライブラリのSimpleLoginSecureを使って簡単なユーザー認証管理を紹介します。

下準備

codeigniterを使う準備は入門編で
ライブラリのSimpleLoginSecureをダウンロードします。

赤枠からダウンロードしてください。
詳しくはこちら

versionの違いでの変更

SimpleLoginSecureのライブラリがCodeIgniter 1.6.3対応なので、現在最新は2.0と書き方が違う部分を変更します。
SimpleLoginSecure.php

$this->CI->db->getwhere

$this->CI->db->get_where

2箇所あるので変更してください。

SimpleLoginSecureを使えるようにする

・application/libraries
の中に書き直したSimpleLoginSecure.phpとphpass-0.1のフォルダをアップロードします。

userテーブルを作る

SimpleLoginSecure.phpを開くと17行目ぐらいにsql文が書いてあるのでこれを使ってテーブルを作ります。

 *   CREATE TABLE `users` (
 *     `user_id` int(10) unsigned NOT NULL auto_increment,
 *     `user_email` varchar(255) NOT NULL default '',
 *     `user_pass` varchar(60) NOT NULL default '',
 *     `user_date` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT 'Creation date',
 *     `user_modified` datetime NOT NULL default '0000-00-00 00:00:00',
 *     `user_last_login` datetime NULL default NULL,
 *     PRIMARY KEY  (`user_id`),
 *     UNIQUE KEY `user_email` (`user_email`)
 *   ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

これで下準備は完成です。

ユーザー認証の部分を作る

まずはユーザーを作成する部分を作ります。

Controllersを作る

・application/controllers/user.php

<?php
class User extends CI_Controller{
  public function __construct(){
  parent::__construct();
  $this->load->database();
  $this->load->library(array('SimpleLoginSecure','session','form_validation'));
  $this->load->helper(array('form','url'));
 }
 function form(){
  $data['error'] = '';
  $this->form_validation->set_rules('user_email', 'メールアドレス', 'required|valid_email');
  $this->form_validation->set_rules('user_pass', 'パスワード', 'required|matches[passconf]');
  $this->form_validation->set_rules('passconf', 'パスワードの確認', 'required');
  if($this->form_validation->run() == FALSE){
   $this->load->view('user/form',$data);
  }else{
   $user_email = $_POST['user_email'];
   $user_pass = $_POST['user_pass'];
   if($this->simpleloginsecure->create($user_email, $user_pass)){
    $data['cont'] = 'ユーザー登録が完了しました。';
    $this->load->view('user/complete',$data);
   }else{
   $data['error'] = '一度登録されたアドレスです。';
   $this->load->view('user/form', $data);
   }
  }
 }
}
?>

今回はモデルでデータベースに追加するのではなく、controllerの部分とlibraryでテーブルにユーザーデータを追加するようにしています。

$this->load->library(array('SimpleLoginSecure','session','form_validation'));

libraryのSimpleLoginsecureとsession、form_validationをまず読み込ませています。

$user_email = $_POST['user_email'];
$user_pass = $_POST['user_pass'];
$this->simpleloginsecure->create($user_email, $user_pass)

formからpostされたデータをSimpleLoginSecureのcreateメソッドを使ってユーザーをテーブルに追加し、ユーザーを作成しています。

Viewsを作る

ユーザー登録のformページを作成します。
・application/views/user/form.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ユーザー追加</title>
</head>
<body>
<div id="main">
<div id="user">
<?php echo validation_errors(); ?>
<?php echo $error; ?>
<?php echo form_open('user/form'); ?>
<dl>
<dt>メールアドレス</dt>
<dd><input type="text" name="user_email" value="<?php echo set_value('user_email'); ?>" /></dd>
<dt>パスワード</dt>
<dd><input type="password" name="user_pass" value="<?php echo set_value('user_pass'); ?>" /></dd>
<dt>パスワードの確認</dt>
<dd><input type="password" name="passconf" value="" /></dd>
</dl>
<input type="submit" value="新規登録する" />
</form>
</div>
</div>
</body>
</html>

登録完了のページを作ります。
・application/views/user/complete.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ユーザー追加</title>
</head>
<body>
<div id="main">
<div id="user">
<p><?php echo $cont; ?></p>
<p><?php echo anchor('user/login','ログインへ'); ?></p>
</div>
</div>
</body>
</html>

暗号化の設定

セッションを使うときにセキュリティを高めるために暗号化をおこなっています。
そのために、
・config/config.php

…省略…
$config['encryption_key'] = "あなたのキー";
…省略…

ログイン画面を作る

ユーザー認証するログイン画面を作ります。

Controllerを書き換える

Controller部分を作り変えます。
・application/controllers/user.php

…省略…
function login(){
 $this->form_validation->set_rules('user_email', 'メールアドレス', 'required|valid_email');
 $this->form_validation->set_rules('user_pass', 'パスワード', 'required');
 if($this->form_validation->run() == FALSE){
 $data['error'] = '';
 $this->load->view('user/login',$data);
 }else{
 $user_email = $_POST['user_email'];
 $user_pass  = $_POST['user_pass'];
 if($this->simpleloginsecure->login($user_email,$user_pass)){
 redirect('user/toku');
 }else{
 $data['error'] ='メールアドレスorパスワードが間違っています。';
 $this->load->view('user/login',$data);
 }
 }
}
…省略…

$this->simpleloginsecure->login($user_email,$user_pass)

loginページのフォームからpostされたemailとパスワードをSimpleloginsecureのloginメソッドを使って、存在するかテーブルと照合して成功したらトップページに飛ぶようになっています。

loginのViewを作る

・application/views/user/login.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ユーザーログイン</title>
</head>
<body><div id="main">
<div id="user">
<a href="user/form">新規登録</a>
<?php echo validation_errors(); ?>
<?php echo $error; ?>
<?php echo form_open('user/login'); ?>
<dl>
<dt>ユーザー名</dt>
<dd><input type="text" name="user_email" value="" /></dd>
<dt>パスワード</dt>
<dd><input type="password" name="user_pass" value="" /></dd>
</dl>
<p><input type="submit" value="ログイン" />
</p>
</form>
</div>
</div></body>
</html>

ユーザーチェックをしているページを作成

ログインをしていたら、開ける特別なページを作っていきます。
※ユーザー認証が必ず必要な場合等はconstruct()の部分に書いたりします。
・application/controllers/user.php

…省略…
function toku(){
 if($this->session->userdata('logged_in')) {
  $this->load->view('user/toku');
 }else{
  $data['error'] = 'ログインしてください。';
  $this->load->view('user/login',$data);
 }
}
…省略…

SimplesecureLoginのメソッドでセッションがあるかどうかを確認します。ある場合はtrueを返してくれます。

$this->session->userdata('logged_in')

後は、ログインのチェックした後のViewの特別なページを作ります。
・application/views/user/toku.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ログイン完了</title>
</head>
<body><div id="main">
<p>ログイン完了</p>
<p><?php echo anchor('user/logout','ログアウト'); ?></p>
</div>
</body>
</html>

※ログアウトの部分は次で作成します。

ログアウト

自分以外絶対にパソコンを使わなければログアウトは必要ないのかもしれませんが、
ログアウトは必要ですよね。ということで、
セッションを削除して、ユーザー認証した部分から解除できるようにします。
・application/controllers/user.php

…省略…
function logout(){
 $this->simpleloginsecure->logout();
  redirect('user/login');
}
…省略…

これでログイン、ログアウトができるようになりました。


コメントする