PHPでログイン(認証)処理 + ログアウト

はい、ということで前回の続きです。

チェックボックスで、Cookieを使った自動ログインできるようにしたのと、ログアウトの処理を加えました。

index.php

<?php

  require('../common/define.php');
  require('../common/function.php');
  require('../Connections/DB.php');

  //セッションの開始(セッション名:memolog)
  session_name('memolog');
  session_start();

  //cookie用のkeyがDBに入っていてそれが一致したら自動ログイン
  if(isset($_COOKIE['mini_auto_login'])){
    $sql="
      SELECT name FROM mini_users
        WHERE
          auto='".myesc($_COOKIE['mini_auto_login'])."'    ";
    $rs = mysql_query($sql,$DB) or die(mysql_error());
    $flg = mysql_num_rows($rs);
    login_update_info();
  }

  //postされたときに実行
  if($_SERVER['REQUEST_METHOD'] == "POST"){
    //nameとpwdがmini_usersに格納されているかチェック
    $sql="
      SELECT name FROM mini_users
        WHERE
          name='".myesc($_POST['name'])."' AND
          pwd='".sha1(myesc($_POST['pwd']))."'
    ";
    $rs = mysql_query($sql,$DB) or die(mysql_error());
    $flg = mysql_num_rows($rs);
    login_update_info();
  }

  //ログインページに移動+情報書き込みの関数
  function login_update_info(){
    global $DB;
    global $flg;
    //存在したら
    if(isset($flg) && $flg!=""){
      //自動ログインにチェックがあったらsession_nameをクッキーに書き込む
      if(isset($_POST['auto']) && $_POST['auto']=="1"){
        $key=sha1(uniqid(rand(),true));
        setcookie('mini_auto_login',$key,time()+3600*24*7);
        //update文用
        $sql_auto=",auto='".$key."'";
      }
      //IPとログイン時間を記憶
      $sql="
        UPDATE mini_users
          SET
            last_ip='".myesc($_SERVER['REMOTE_ADDR'])."',
            last_login='".myesc(date('Y-m-d H:i:s'))."'
            ".$sql_auto."
      ";
      $rs = mysql_query($sql,$DB) or die(mysql_error());
      //セッションIDを変更
      session_regenerate_id();
      //login.phpに飛ばす
      header("location:login.php");
    }
  }

?>

一部関数化したけど、だいぶ長くなってしまって見づらいな。。あとCookieの中身の文字列がDBに格納してあったら即ログインするようにしてるんだけどこれってやっぱまずいんかな…。でもCookieにユーザ名とかパスワードとか持たせたくないからなぁ。

logout.php

<?php

  require('../common/define.php');
  require('../common/function.php');
  require('../Connections/DB.php');

  session_name("memolog");
  session_start();

  //自動ログインクッキーを削除
  if (isset($_COOKIE['mini_auto_login'])) {
    //DBからも情報を削除
    $sql="
        UPDATE mini_users
          SET
            auto=''
    ";
    $rs = mysql_query($sql,$DB) or die(mysql_error());
    setcookie('mini_auto_login', '', time()-42000, '/users/');
  }

  //セッション変数を全て解除する
  $_SESSION = array();

  //セッションクッキーを削除
  if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
  }

  //最終的に、セッションを破壊する
  session_destroy();

  header("Location: ./index.php");

?>
  • ブックマーク
  • Feedly

この記事を書いた人

キタジマタカシ

長崎在住、フリーランスのWordPress テーマ / プラグインデベロッパー。 多数のプロダクトをオープンソースで開発・公開しています。現在は WordPress 有料テーマ Snow Monkey を開発・販売しています。