====== PHPで手軽にLogin処理を実装したい? - Login.php ======
{{:css-small-box:chain.jpg?nolink|}}
業務アプリや会員向けサービスなど、Webでログイン処理が必要になることは多いけど、毎回作ってたら面倒になってきたので使い回しの利くライブラリにしてみた。
一定回数ログインに失敗したらアカウントをロックしてメールで通知する処理も必要だけど、DBのテーブルなんかとの結合度が高くなっちゃうから今回は入れなかった。
===== ライセンス =====
MITライセンス
===== サンプル =====
Login.phpを使う例。
==== ログインを必要とするページのサンプル ====
check('login_form.php');
?>
Here is "test.php".
==== ログインフォームのあるページのサンプル ====
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');
}
?>
==== ログアウトするページのサンプル ====
end();
?>
Logged out.
===== ソースコード =====
_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");
}
}