php-tool-box:login
文書の過去の版を表示しています。
PHPで手軽にLogin処理を実装するツール
業務アプリや会員向けサービスなど、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.1334238140.txt.gz · 最終更新: 2012/04/12 22:42 by dgbadmin