2010-08-16 12 views
5

मैं इसे सेट अप करना चाहता हूं, जहां कोई अनुरोध "लॉगआउट" में भेजता है, तो यह स्वचालित रूप से उन्हें "सफल लॉग आउट" कहकर एक पृष्ठ पर ले जाएगा। यदि ग्राहक बैक बटन दबाकर या प्रतिबंधित क्षेत्र में जाने का प्रयास करता है, तो वह फिर से HTTP ऑथ मांगेगा।PHP: HTTP बेसिक - लॉग ऑफ

example.com/restricted/index.php:

<?php 
    session_start(); 

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

    if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || !isset($_SESSION["login"])) 
    { 

     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     $_SESSION["login"] = true; 
     // Print HTML that a password is required 
     exit; 
    } 
?> 
// The rest of the page is then displayed like normal 

उपयोगकर्ता सफल दौरा example.com/logout.php अगर उदाहरण

यह क्या मैं अब तक है। com/प्रतिबंधित/index.php? लॉगआउट एक्सेस किया गया है। जब उपयोगकर्ता वापस जाने की कोशिश करता है हालांकि यादृच्छिक चीजें होती हैं, कभी-कभी यह दो बार HTTP प्रमाणीकरण के लिए पूछेगी (???), कभी-कभी यह लूप (?) में प्रमाणीकरण मांगना जारी रखेगी और कभी-कभी यह मुझे वापस जाने देगी मैंने कभी लॉग आउट नहीं किया।

मैं सत्रों के काम के लिए नया हूं लेकिन मेरी समझ यह है: अगर/जब व्यक्ति मान्य है, तो यह सत्य के मूल्य के साथ लॉगिन नामक सत्र में एक चर को संग्रहीत करता है ... यदि यह हर किसी के साथ एक GET अनुरोध प्राप्त करता है लॉगआउट, फिर वह उस सत्र चर को हटा देगा और logout.php पर वापस जायेगा ... फिर जब मैं इंडेक्स पर वापस क्लिक करता हूं तो यह मुझे प्रमाणीकरण के बिना वापस आने देगा, जब सत्र [लॉगिन] माना जाता है ।

इस PHP कोड में कोई भी सुधार की सराहना की जाती है। मुझे पता है कि मुझे HTTP बेसिक का उपयोग नहीं करना चाहिए और एसक्यूएल को शामिल करना चाहिए, लेकिन मेह। यह एक अस्थायी समाधान है।

संपादित करें: यदि निर्देशों के साथ एक उदाहरण शामिल है तो मैं MySQL के साथ एक समाधान स्वीकार करूंगा। मेरे पास कोई MySQL या PHP डेटाबेस ज्ञान है (अभी तक)

+1

सत्रों के बिना, आपकी सबसे अच्छी शर्त बुनियादी क्षेत्र स्ट्रिंग को बदलना है। – stillstanding

+0

क्या यह केवल एक अस्थायी समाधान के लिए इतना प्रयास नहीं है? –

+0

@ मुख्य समस्या को बरकरार रखना कब इसे भेजना है। किसी लॉग इन उपयोगकर्ता से कॉल को अलग करने और लॉग आउट से कॉल करने के लिए कैसे करें :) –

उत्तर

1

एक मोटा अनुमान आप शुरू करने के लिए:

<?php 
    session_start(); 

    if(isset($_GET['logout'])) 
    { 
    session_destroy(); 
    header('Location: ../logout.php'); 
    exit; 
    } 

    if(!isset($_SESSION['login'])) 
    { 
    if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) 
    { 
     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     // Print HTML that a password is required 
     exit; 
    } 
    else 
    { 
     // Validate the $_SERVER['PHP_AUTH_USER'] & $_SERVER['PHP_AUTH_PW'] 
     if($_SERVER['PHP_AUTH_USER']!='TheUsername' 
      || $_SERVER['PHP_AUTH_PW']!='ThePassword') 
     { 
     // Invalid: 401 Error & Exit 
     header("HTTP/1.0 401 Unauthorized"); 
     header("WWW-authenticate: Basic realm=\"Tets\""); 
     header("Content-type: text/html"); 
     // Print HTML that a username or password is not valid 
     exit; 
     } 
     else 
     { 
     // Valid 
     $_SESSION['login']=true; 
     } 
    } 
    } 
?> 
// The rest of the page is then displayed like normal 
+0

मैं PHP_AUTH_USER और PHP_AUTH_PW को बिना पार्सिंग और .htpass और ऐसे के सत्यापन कैसे करूं? – ParoX

+0

यदि यह एक अस्थायी समाधान है, और आपको केवल उपयोगकर्ता नाम/पासवर्ड के एक सेट की आवश्यकता है, तो बस कुछ करें जैसे '$ ($ _SERVER [' PHP_AUTH_USER ']! =' TheUsername '|| $ _SERVER [' PHP_AUTH_PW ']!= 'ThePassword') {/ * 401 त्रुटि और बाहर निकलें * /} अन्य {$ _SESSION ['login'] = true} ' व्यक्तिगत रूप से, मैंने पहले PHP_AUTH_USER/PHP_AUTH_PW का उपयोग नहीं किया है, मेरे पास एक ऐसा फॉर्म है जो मुझे पास करता है $ _GET या $ _POST के माध्यम से उनका उपयोगकर्ता नाम और पासवर्ड - बहुत आसान है। –

+0

@Brian लॉगिन बचाएं और डीबी में पास करें? –

1

मैं इसे चारों ओर एक रास्ता मिल गया है।

2 फ़ाइलें: index.php और logout.php

यहाँ मेरी 'index.php' कोड है:

# CHECK LOGIN. 
if (!isset($_SESSION["loged"])) { 
    $_SESSION["loged"] = false; 
} else { 
    if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { 
     if (($_SERVER['PHP_AUTH_USER'] == L_USER) && (md5($_SERVER['PHP_AUTH_PW']) == L_PASS)) { 
      $_SESSION["loged"] = true; 
     } 
    } 
} 
if ($_SESSION["loged"] === false) { 
    header('WWW-Authenticate: Basic realm="Need authorization"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    die('<br /><br /> 
    <div style="text-align:center;"> 
     <h1 style="color:gray; margin-top:-30px;">Need authorization</h1> 
    </div>'); 
} 

और यहाँ मेरे 'लॉगआउट है .php 'कोड:

session_start(); 
$_SESSION["loged"] = false; // We can't use unset($_SESSION) when using HTTP_AUTH. 
session_destroy(); 
0

आप मेटा टैग http-equiv="refresh" का उपयोग बहुत कम प्रतिक्रिया समय के साथ कर सकते हैं (उदा। content="1")। यह रीफ्रेश किसी भी $_POST को साफ़ करेगा।

if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!='myusername' || $_SERVER['PHP_AUTH_PW']!='mypassword' || isset($_POST['logout'])) { 
    header('WWW-Authenticate: Basic realm="My protected area"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    echo '<html><head><title>401 Unauthorized</title><meta http-equiv="refresh" content="1"></head><body><h1>401 Unauthorized</h1><p>You are not allowed to see this page. Reload the page to try again.</p></body></html>'; 
    exit(); 
} 
संबंधित मुद्दे