PHPでのセッションによる認証

私たちの認証は次のように機能するはずです:サイトで認証したいユーザーは、 ページ login.php にアクセスし、正しいログイン名とパスワードを入力し、 その後は認証された状態でサイトのページ間を移動します。

サイトの他のページがユーザーが認証されていることを認識するためには、 セッション内にそのマークを保存する必要があります。

セッションをまだ接続しておらず、サイトの他のページがユーザーが認証されているかどうかを判断できないため、 現在の認証は完全には機能していません。

認証のマークをセッション変数 $_SESSION['auth'] に保存します。 そこに true が記録されていればユーザーは認証されており、 null であれば認証されていません。

私たちのコードに適切な修正を加えましょう:

html<?php
  session_start();
  
  if (!empty($_POST['password']) and !empty($_POST['login'])) {
    $login = $_POST['login'];
    $password = $_POST['password'];
    
    $query = "SELECT * FROM users WHERE login='$login' AND password='$password'";
    $res = mysqli_query($link, $query);
    $user = mysqli_fetch_assoc($res);
    
    if (!empty($user)) {
      $_SESSION['auth'] = true;
    } else {
      // ログイン名またはパスワードが間違っています
    }
  }
?>

これで、サイトの任意のページで、ユーザーが認証されているかどうかを 次の方法で確認できるようになりました:

html<?php
  if (!empty($_SESSION['auth'])) {
    
  }
?>

認証されていないユーザーに対して、あるページのテキスト全体を 完全に閉じることができます:

html<?php if (!empty($_SESSION['auth'])): ?>
  <!DOCTYPE html>
  <html>
    <head>
      
    </head>
    <body>
      <p>認証されたユーザーのみのテキスト</p>
    </body>
  </html>
<?php else: ?>
  <p>認証してください</p>
<?php endif; ?>

ページの一部のみを閉じることもできます:

html<!DOCTYPE html>
<html>
  <head>
    
  </head>
  <body>
    <p>すべてのユーザー向けのテキスト</p>
    <?php
      if (!empty($_SESSION['auth'])) {
        echo '認証されたユーザーのみのテキスト';
      }
    ?>
    <p>すべてのユーザー向けのテキスト</p>
  </body>
</html>
Задание 1

私たちのサイトには、ページ login.php の他に、 1.php、2.php、3.php ページがあるとします。 認証されたユーザーのみがこれらのページにアクセスできるようにしてください。

Задание 2

私たちのサイトに index.php ページもあるとします。 このページの一部はすべてのユーザーに公開され、 一部は認証されたユーザーのみが利用できるようにしてください。

Задание 3

認証に成功した際に、ユーザーのログイン名もセッションに保存されるように コードを修正してください。

Задание 4

サイトのどのページにアクセスしても、認証されたユーザーは自分のログイン名を表示し、 認証されていないユーザーは認証ページへのリンクを表示するようにしてください。