CodeIgniter2.XでSimpleLoginを使う

CodeIgniter
スポンサーリンク

CodeIgniterにはSimpleLoginという、名前の通りシンプルな認証ライブラリがあります。ところが、CodeIgniter2になって構成が大きく変わったため、まともに動作しませんでした。

そこで、分からないながらも、動くレベルまで修正してみました。

確認環境

  • CodeIgniter2(ci-ja-all-in-one-2.0.0-1.zip)

なにぶん、プログラム初心者が修正したものですので、使用は自己責任にてお願いいたします。

ログインユーザー用データベース設定(MySQL)

“`CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(64) NOT NULL,
`password` varchar(64) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

/*仮にユーザーを登録する*/
INSERT INTO `users` VALUES (1, ‘test’, MD5(‘test’));
“`

application/controllers/sample.php

“`<?php
class Sample extends CI_Controller {

function __construct()
{
parent::__construct();
// シンプルログインライブラリを読み込む
$this->load->library(‘simplelogin’);

$this->load->library(‘session’);
$this->load->database();
$this->load->helper(array(‘form’, ‘url’));
$this->load->library(‘form_validation’);
$this->output->set_header(‘Content-Type: text/html; charset=UTF-8’);
}

function index()
{
// セッションでログイン状態を確認
if($this->session->userdata(‘logged_in’))
{
//User is logged in
echo ‘あなたはログイン中です’;
echo ‘<hr>’;
echo anchor(‘sample/logout’, ‘ログアウトする’);
}
else
{
//User is not logged in
echo ‘あなたはログインしていません’;
echo ‘<hr>’;
echo anchor(‘sample/login’, ‘ログインフォームへ’);
}
}

function login()
{
// バリデーションルール設定
$rules[‘username’] = "trim|required";
$rules[‘password’] = "trim|required";

$this->form_validation->set_rules($rules);

// バリデーションエラー時のフィールド名設定
// 詳しくは system/language/フォルダ名/validation_lang.php
$fields[‘username’] = ‘ユーザ名’;
$fields[‘password’] = ‘パスワード’;

//$this->form_validation->set_fields($fields);

// 検証エラーまたは初回アクセス時
if ($this->form_validation->run() == FALSE)
{
$this->load->view(‘login’);
}
else
{
// ユーザ名:test パスワード:testでログインメソッド実行
$result = $this->simplelogin->login($this->input->post(‘username’), $this->input->post(‘password’));

// 結果の検証
if ($result == TRUE)
{
// リダイレクトする
redirect(‘sample/’, ‘refresh’);
}
else
{
echo ‘ユーザ名またはパスワードに誤りがあります。’;
echo ‘<hr>’;
echo anchor(‘sample/login’, ‘もう一度入力する’);
}
}
}
function logout()
{
// ログアウトメソッド実行
$this->simplelogin->logout();
echo ‘ログアウトしました’;
echo ‘<hr>’;
echo anchor(‘sample/’, ‘indexページへ’);
}

}
?>“`

application/libraries/Simplelogin.php

“`<?php if (!defined(‘BASEPATH’)) exit(‘No direct script access allowed’);
/**
* Simplelogin Class
*
* Makes authentication simple
*
* Simplelogin is released to the public domain
* (use it however you want to)
*
* Simplelogin expects this database setup
* (if you are not using this setup you may
* need to do some tweaking)
*/

class Simplelogin {

var $CI;
var $user_table = ‘users’;

function Simplelogin()
{
// get_instance does not work well in PHP 4
// you end up with two instances
// of the CI object and missing data
// when you call get_instance in the constructor
//$this->CI =& get_instance();
}

/**
* Create a user account
*
* @access public
* @param string
* @param string
* @param bool
* @return bool
*/
function create($user = ”, $password = ”, $auto_login = true)
{
//Put here for PHP 4 users
$this->CI =& get_instance();

//Make sure account info was sent
if ($user == ” OR $password == ”)
{
return false;
}

//Check against user table
$this->CI->db->where(‘username’, $user);
$query = $this->CI->db->getwhere($this->user_table);

if ($query->num_rows()> 0)
{
//username already exists
return false;

}
else
{
//Encrypt password
$password = md5($password);

//Insert account into the database
$data = array(
‘username’ => $user,
‘password’ => $password
);
$this->CI->db->set($data);
if(!$this->CI->db->insert($this->user_table)) {
//There was a problem!
return false;
}
$user_id = $this->CI->db->insert_id();

//Automatically login to created account
if ($auto_login)
{
//Destroy old session
$this->CI->session->sess_destroy();

//Create a fresh, brand new session
$this->CI->session->sess_create();

//Set session data
$this->CI->session->set_userdata(array(‘id’ => $user_id,’username’ => $user));

//Set logged_in to true
$this->CI->session->set_userdata(array(‘logged_in’ => true));

}

//Login was successful
return true;
}

}

/**
* Delete user
*
* @access public
* @param integer
* @return bool
*/
function delete($user_id)
{
//Put here for PHP 4 users
$this->CI =& get_instance();

if(!is_numeric($user_id))
{
//There was a problem
return false;
}

if($this->CI->db->delete($this->user_table, array(‘id’ => $user_id)))
{
//Database call was successful, user is deleted
return true;
}
else
{
//There was a problem
return false;
}
}

/**
* Login and sets session variables
*
* @access public
* @param string
* @param string
* @return bool
*/
function login($user = ”, $password = ”)
{
//Put here for PHP 4 users
$this->CI =& get_instance();

//Make sure login info was sent
if ($user == ” OR $password == ”)
{
return false;
}

//Check if already logged in
if ($this->CI->session->userdata(‘username’) == $user)
{
//User is already logged in.
return false;
}

//Check against user table
$this->CI->db->where(‘username’, $user);
$query = $this->CI->db->get_where($this->user_table);

if ($query->num_rows()> 0)
{
$row = $query->row_array();

//Check against password
if(md5($password) != $row[‘password’])
{
return false;
}

//Destroy old session
$this->CI->session->sess_destroy();

//Create a fresh, brand new session
$this->CI->session->sess_create();

//Remove the password field
unset($row[‘password’]);

//Set session data
$this->CI->session->set_userdata($row);

//Set logged_in to true
$this->CI->session->set_userdata(array(‘logged_in’ => true));

//Login was successful
return true;
}
else
{
//No database result found
return false;
}

}

/**
* Logout user
*
* @access public
* @return void
*/
function logout()
{
//Put here for PHP 4 users
$this->CI =& get_instance();

//Destroy session
$this->CI->session->sess_destroy();
}
}
?>
“`

application/views/login.php

“`<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>シンプルログインフォーム</title>
</head>
<body>

<?php if ($this->form_validation->error_string):?>
<?php echo $this->form_validation->error_string; ?>
<?php endif;?>

<p>シンプルログインフォーム</p>

<?php echo form_open(‘sample/login’); ?>
<dl>
<dt>ユーザ名(test)</dt>
<dd><?php echo form_error(‘username’); ?><input type="text" name="username" value="<?php echo set_value(‘username’); ?>" /></dd>
<dt>パスワード(test)</dt>
<dd><?php echo form_error(‘password’); ?><input type="text" name="password" value="<?php echo set_value(‘password’); ?>" /></dd>
</dl>
<input type="submit" value="ログイン" />
<?php echo form_close(); ?>

</body>
</html>“`

ダウンロード

参考