2012-01-25 27 views
9

ログインしているサイト(ユーザー名とパスワード)で現在作業中です - パスワード保護は、Webサーバー内のオペレーティングシステムによって、レルムと呼ばれるフォルダレベルで実行されますOS。今のところ、適切なPHPログインシステムが見つかるまでこれが必要です。PHPセッションがログアウトボタンで破棄される

次のコードは、(一番下のコードスニペットを参照してください)私は3つのファイルを使用していprevious question on the stack overflow.

に基づいています。

処理は次のとおりです。 - index.phpの[ログイン]ボタン - 認証用インデックスファイルにアクセスするためのユーザ名とパスワードを入力します。 - logout.phpファイルを参照するログアウトボタンをクリックします。キャッシュをクリアしてユーザをトップレベルのインデックスに戻すべきです(SHOULD)。

「セッションを破棄しない」とは、プロンプトが表示されたときにパスワードを再入力するように求められていないということです。

私のPHPについての私の知識は私にはここで少し困っています。

index.phpを(ボタンでログを持つトップレベルのファイル)

<?php session_start(); ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Test</title> 
</head> 
<body> 
<a href="authenticate/index.php">Log In Btn</a> 
</body> 
</html> 

認証/ index.phpをは(このフォルダには、パスワードで保護されています - これはリンクログアウトボタンでインデックスファイルが含まれていますlogout.phpファイル)

<?php session_start(); ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>Log out</title> 
</head> 
<body> 
<a href="logout.php">Log Out Btn</a> 
</body> 
</html> 

認証/ logout.php

<?php 
session_start(); //to ensure you are using same session 
session_destroy(); //destroy the session 
header("location:/index.php"); //to redirect back to "index.php" after logging out 
exit(); 
?> 
+3

フォルダがパスワードで保護されている場合、PHPは、認証を行っていません。 Apache(またはWebサーバー)はです。 – xbonez

+0

それは感謝します、ありがとう非常に@xbonez – fitzilla

答えて

22

パスワードで保護されているフォルダには、はありません。はPHPと関連があります!

この方法は、「基本認証」と呼ばれています。ユーザーがブラウザを閉じてから開くことを除いて、ブラウザからログアウトするクロスブラウザの方法はありません。

ここでは、PHPでこれを行う方法を説明します(Apache基本認証.htaccessまたはどこそれが最初である):

login.php:

<?php 
session_start(); 
//change 'valid_username' and 'valid_password' to your desired "correct" username and password 
if (! empty($_POST) && $_POST['user'] === 'valid_username' && $_POST['pass'] === 'valid_password') 
{ 
    $_SESSION['logged_in'] = true; 
    header('Location: /index.php'); 
} 
else 
{ 
    ?> 

    <form method="POST"> 
    Username: <input name="user" type="text"><br> 
    Password: <input name="pass" type="text"><br><br> 
    <input type="submit" value="submit"> 
    </form> 

    <?php 
} 

のindex.php

<?php 
session_start(); 
if (! empty($_SESSION['logged_in'])) 
{ 
    ?> 

    <p>here is my super-secret content</p> 
    <a href='logout.php'>Click here to log out</a> 

    <?php 
} 
else 
{ 
    echo 'You are not logged in. <a href="login.php">Click here</a> to log in.'; 
} 

logout.php:

<?php 
session_start(); 
session_destroy(); 
echo 'You have been logged out. <a href="/">Go back</a>'; 

明らかにこれは非常に基本的な実装です。ユーザー名とパスワードは、ハードコードされた比較ではなく、データベースに格納されていると考えられます。私はちょうどあなたにセッションのことをする方法のアイデアを与えようとしています。

これは何が起こっているかを理解するのに役立ちます。

+0

恐ろしい!ログアウトコードがはるかに複雑なHTTP認証方法よりもはるかに優れています。 3つのコードブロックにPHP終了タグを追加する場合は、私はあなたに答えます。おっと、私はすでにやった! :-) –

+1

@FrankConijn http://php.net/manual/en/language.basic-syntax.phptags.phpを参照してください: "ファイルが純粋なPHPコードの場合は、PHP終了タグをPHPの終了タグの後ろに偶然空白や改行が追加されるのを防ぎます。これは、スクリプト中のその時点で出力を送信する意図がないときにPHPが出力バッファリングを開始するため、望ましくない影響を引き起こす可能性があります。 " – stackunderflow

+0

ログアウトはpostメソッドを使って実装しなければならないと思います。 – chespinoza

3

最初にそのログアウトボタンにlogout.phpページのリンクを投稿してください。ここで

コードです::セッションが開始されたとき

<?php 
session_start(); 
session_destroy(); 
?> 

、最後の/現在のユーザーのセッションが開始されているので、必要のないページでは以下に示されているコードを作りますユーザー名を宣言します。 session_destroyメソッドによって自動的に削除されます。

0

//ログアウト

if(isset($_GET['logout'])) { 
    session_destroy(); 
    unset($_SESSION['username']); 
    header('location:login.php'); 
} 

?>

+0

このコードスニペットをご利用いただき、ありがとうございます。適切な説明(* meta.stackexchange.com/q/114762)は、*なぜ*これが問題の良い解決策であるかを示すことで長期的な価値を向上させ、将来の読者にとって他の同様の質問。あなたの前提を含め、あなたの答えを[編集]して説明を加えてください。 –

関連する問題