php
web
前回はアカウント登録のページを作りました。
今回は作ったアカウントを使って、ログインするページを作ります。
このページは
-
ユーザー名・パスワードを入力
入力が正しければ、ログイン状態でしか見れないページを表示
今回のポイントはセッションを使ってログイン状態を保持することです。
セッションは一度作られると、ページをまたいでも保存した値が保持されます。
この値はサーバーに一定期間保存されています。
ですので、これを使うと一度ログインしたあとはログインしたままになるページが作れます。
セッションを使うページでは先頭の<?phpの直後に
<?php
session_start();
を置きます。
この後からセッション変数 $_SESSIONが使えるようになります。
この変数に値を記録すれば、ページを遷移したり、ブラウザを閉じたりしても値が保存され続けます。
ログインページのコードです。
<?php session_start(); if(!empty($_SESSION['username'])) header("Location: ./session.php"); else { $username = $_SESSION['username']; $salt_password = "salting_sample";//本当はもっと難しいものにする $salt_username = "salting_sample2";//本当はもっと難しいものにする $user_path = "./users/"; $status = "none"; $error_message = "不明なエラーです。時間をおいて再度ご登録ください。"; $succeeded = false; if(!empty($_POST["username"]) && !empty($_POST["password"])) { $username = hash("sha256", $_POST["username"] . $salt_username); $password = hash("sha256", $_POST["password"] . $salt_password); if(file_exists($user_path . $username . "/password.txt")) { $password_saved = file_get_contents($user_path . $username . "/password.txt"); if ($password_saved == $password) { $status = "ok"; $_SESSION["username"] = $_POST["username"]; header("Location: ./session.php"); $succeeded = true; } } //if(0) if(!$succeeded) { $status = "failed"; $error_message = "ユーザーが存在しないか、パスワードが違います。"; $_SESSION["username"] = null; } } else { $status = "none"; } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>ログイン</title> </head> <body> <h1>ログイン</h1> <?php if($status == "failed"): ?> <p> エラー: <?php echo "${error_message}\n"; ?> <?php //$usr = $_POST["username"]; //echo "ユーザー名: ${usr} \n"; ?> <form method="POST" action="login.php"> ユーザ名:<input type="text" name="username" /> パスワード:<input type="password" name="password" /> <input type="submit" value="送信" /> </form> </p> <?php else: ?> <form method="POST" action="login.php"> ユーザ名:<input type="text" name="username" /> パスワード:<input type="password" name="password" /> <input type="submit" value="送信" /> </form> <?php endif; ?> </body> </html>
実行例はこちらです。
前回つくったアカウントでログインしてみてください。
ログイン後のページでは、ログインページが保存したユーザー名を表示してみましょう。
もしセッションにユーザー名が設定されていない=ログインしていないならば、
ログイン画面にリダイレクトします。
つまり、このページはログインしていなければ見れないのです。
<?php session_start(); $username = $_SESSION['username']; if(!isset($_SESSION['username']) || empty($_SESSION['username'])) { header("Location: ./login.php"); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>ログイン後のページ</title> </head> <body> <h1>ログイン後のページ</h1> <?php echo "${username}さん\n"; ?> <br><br> <a href="./logout.php">ログアウト</a> </body> </html>ログイン後のページでは、ログインページが保存したユーザー名を表示してみましょう。
もしセッションにユーザー名が設定されている=ログインしているのならば、
ログイン後の画面にリダイレクトします。
つまり、このページはログインしていなければ見れないのです。
<?php session_start(); $username = $_SESSION['username']; if(!isset($_SESSION['username']) || empty($_SESSION['username'])) { header("Location: ./login.php"); } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>ログイン後のページ</title> </head> <body> <h1>ログイン後のページ</h1> <?php echo "${username}さん\n"; ?> <br><br> <a href="./logout.php">ログアウト</a> </body> </html>
このページでは逆にログインしていなければログイン画面(login.php)にリダイレクトします。
最後に、ログアウトするページのコードです。
<?php session_start(); if(!isset($_SESSION['username']) || empty($_SESSION['username'])) header("Location: ./login.php"); session_destroy(); ?< <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>ログアウトしました</title> </head> <body> ログアウトしました。 </body> </html>