ゼロと無限の間に

フリーでオープンソースなJavaScriptとかPHPとか。

ユーザ用ツール

サイト用ツール


サイドバー

何かありましたら、メールで連絡いただくか、ブログのどこかにコメント入れてくださいね ^_^

Menu

ゼロと無限の間に

はじめに

作った主なサイト

作った主な便利ツール(無料)

ログ (Blog)

php-tool-box:login

PHPで手軽にLogin処理を実装したい? - Login.php

業務アプリや会員向けサービスなど、Webでログイン処理が必要になることは多いけど、毎回作ってたら面倒になってきたので使い回しの利くライブラリにしてみた。

一定回数ログインに失敗したらアカウントをロックしてメールで通知する処理も必要だけど、DBのテーブルなんかとの結合度が高くなっちゃうから今回は入れなかった。

ライセンス

MITライセンス

サンプル

Login.phpを使う例。

ログインを必要とするページのサンプル

<?php
require_once('Login.php');
 
$login = new Login();
 
// ログインしているかチェックする
// 未ログインの場合はログインページに飛ばされるので、以降の処理は実行されない
$login->check('login_form.php');
?>
Here is "test.php".

ログインフォームのあるページのサンプル

<?php
require_once('Login.php');
 
$login = new Login();
 
if ($_POST) {
	// 普通はsaltとhashはユーザー登録時に生成してDBに登録しておくものだが
	// ここでは簡略化のためにその場で毎回生成する
	$salt = 'himitsu' . time();
	$hash = $login->hash('valid pswd', $salt);
 
	// 別のページへアクセスしようとしてログインフォームに飛ばされてきた場合、
	// ログイン成功時には元のページに飛ばされるので、以降の処理は実行されない
	if ($login->login($_POST['pswd'], $salt, $hash)) {
		// 最初からログインフォームにアクセスしてきた場合のみ表示される
		echo 'Success';
	} else {
		echo 'Failed';
	}
}
 
function h($s) {
	return htmlSpecialChars($s, ENT_QUOTES, 'UTF-8');
}
?>
<hr />
<form method="POST" action="login_form.php">
User ID
<input type="text" name="id" value="<?php echo h($_POST['id']) ?>" />
<br />
Password
<input type="password" name="pswd" value="<?php echo h($_POST['pswd']) ?>" />
<br />
<input type="submit" />
</form>

ログアウトするページのサンプル

<?php
require_once('Login.php');
 
$login = new Login();
$login->end();
?>
Logged out.

ソースコード

<?php
/**
 *	Login.php - お手軽ログインヘルパー
 *	@version   0.1.0
 *	@see       http://0-oo.net/sbox/php-tool-box/login
 *	@copyright 2012 dgbadmin@gmail.com
 *	@license   http://0-oo.net/pryn/MIT_license.txt (The MIT license)
 */
class Login {
	private $_option;
 
	/**
	 *	コンストラクタ
	 *	@param	array	$option	(optional) デフォルトの設定を変えたい場合は指定する
	 */
	public function __construct(array $option = array()) {
		$this->_option = array_merge(array(
			'algo' => 'sha256',	// hashアルゴリズム
			'session_key' => 'login',	// ログイン情報を保存するsessionのkey
			'session_url_key' => 'request_url',	// ログイン後に遷移するURLを保存するsessionのkey
		), $option);
 
		if (!session_id()) {
			session_start();
		}
	}
	/**
	 *	ログイン済みかチェックする
	 *	未ログインの場合、ログインページへリダイレクトしてexitする
	 *	@param	string	$loginUrl	ログインページのURL
	 */
	public function check($loginUrl) {
		if ($_SESSION[$this->_option['session_key']]) {
			return;
		} else if (!$_POST) {
			$_SESSION[$this->_option['session_url_key']] = $_SERVER['REQUEST_URI'];
		}
 
		header("Location: $loginUrl");
		exit;
	}
	/**
	 *	パスワードを検証する
	 *	パスワードが正しく、かつ元々別のページへのアクセスだった場合は
	 *	そのページにリダイレクトしてexitする
	 *	@param	string	$pswd	入力されたパスワード
	 *	@param	string	$salt	salt
	 *	@param	string	$hash	パスワードとsaltをhash化した文字列
	 *	@param	mixed	$data	ログイン情報としてsessionに保存するデータ
	 *	@return	boolean	パスワードが正しいかどうか
	 */
	public function login($pswd, $salt, $hash, $data = true) {
		if ($this->hash($pswd, $salt) !== $hash) {
			return false;
		}
 
		session_regenerate_id(true);
		$_SESSION[$this->_option['session_key']] = $data;
		$sessionUrlKey = $this->_option['session_url_key'];
 
		if (!$_SESSION[$sessionUrlKey]) {
			return true;
		}
 
		header('Location: ' . $_SESSION[$sessionUrlKey]);
		$_SESSION[$sessionUrlKey] = null;
		exit;
	}
	/**
	 *	sessionのデータを消す
	 *	@return	処理結果
	 */
	public function end() {
		$_SESSION = array();
		return session_destroy();
	}
	/**
	 *	パスワードとsaltからhashを生成する
	 *	パスワードの登録・変更時には毎回違うsaltを使うことが推奨される
	 *	@param	string	$pswd	入力されたパスワード
	 *	@param	string	$salt	salt
	 *	@return	string	hash
	 */
	public function hash($pswd, $salt) {
		return hash($this->_option['algo'], "$salt:$pswd");
	}
}
php-tool-box/login.txt · 最終更新: 2012/04/12 22:46 by dgbadmin