2011-11-06 46 views
-1

我想建立一個簡單的用戶授權系統,其中.txt文件存儲用戶名和密碼信息。我知道這可能應該以不同的方式完成(通過數據庫),但我正在做這個練習。如果任何人都可以幫我解決我的問題,將不勝感激。關於用戶授權在PHP的問題

到目前爲止,我已經建立了register.php和login.php,但我不確定從這裏去哪裏。這裏是我的三個問題:

  1. 假設我有一個我希望保護的html網站。我將如何合併login.php,以便如果未登錄的用戶嘗試訪問頁面的內容,系統會提示他們登錄?我需要在每個html頁面中放置什麼東西嗎?

  2. 如何在此過程中實施Cookie?登錄的用戶在20分鐘內不必重新登錄。理想情況下,我想在用戶登錄後發送cookie,但我該怎麼做?

  3. 我想我的register.php檢查現有的用戶,所以所有的名字都是唯一的。到目前爲止,我沒有正確地做到這一點。我的代碼有什麼問題?

這裏是我的代碼:

的login.php

<?php 

$check = 0; 
if (isset($_POST['submit'])) 
{ 

$name = htmlentities($_POST['name']); 
$name = strtolower($name); 
$password = htmlentities($_POST['apw']); 
$filename = getcwd() . "/psverification.txt"; 
$lines = file($filename , FILE_IGNORE_NEW_LINES); 
printf ("Hi %s,</br />", $name); 
foreach($lines as $key => $line) 
{ 
    list($username, $pw) = explode('|', $line); 
    if($username == $name && $pw == $password) 
$check++; 
break; 
} 
if ($check == 1){ 
//Redirect to home page 
Header("Location: index.html"); 
} 
else{ 
printf("Your username or password are invalid. Please try again."); 

} 

} 

?> 

<form method = "POST" action = "<?php echo $_SERVER['PHP_SELF']; ?>"> 
<p> 
Username:<br /> 
<input type = "text" id="name" name="name" size="20" maxlength="40" /> 
</p> 

<p> 
E-mail Address:<br /> 
<input type = "text" id="apw" name="apw" size="20" maxlength="40" /> 
</p> 

<input type="submit" id="submit" name ="submit" name ="submit" value="Log in" /> 

<p> 
<a href="register.php">Register</a></p> 
</form> 

REGISTER.PHP

<?php 

if (isset($_POST['submit'])) 
{ 

$username = $_POST['user']; 
$password = $_POST['password']; 
$confirmpw = $_POST['confirmpw']; 
$username = strtolower($username); 


//Check if passwords match 
if ($password != $confirmpw){ 
print "Passwords do not match, please try again."; 
} 
else{ 
//the data 
$data = "$username|$password\n"; 

//open the file and choose the mode 

$fh = fopen("psverification.txt", "a+"); 

// Cycle through the array 
while (($buffer = fgets($fh, 4096)) !== false) 
{ 
    // Parse the line 
    list($usercheck, $passwordcheck) = explode('|', $buffer); 
    if (trim($usercheck) == $username) 
{ 
print "The username is already in our system. Please use another one.";} 

else { 
fwrite($fh, $data); 
//Redirect to home page 
Header("Location: index.html"); 
} 

} 
//close the file 

fclose($fh); 


} 
} 

?> 

<form method = "POST" action = "<?php echo $_SERVER['PHP_SELF']; ?>"> 
<p> 
    Username:<br /> 
<input type = "text" id="user" name="user" size="20" maxlength="40" /> 
</p> 

    <p> 
    Password:<br /> 
    <input type = "password" id="password" name="password" size="20" maxlength="40" /> 
    </p> 

Confirm Password:<br /> 
<input type = "password" id="confirmpw" name="confirmpw" size="20" maxlength="40" /> 
</p> 

<input type="submit" id="submit" name ="submit" name ="submit" value="Register" /> 
</form> 

在此先感謝。任何例子將不勝感激。

+2

你或許應該打破這種成獨立的問題。至少#3部分,因爲它不是概念,但你的實際代碼。 – mrtsherman

+0

同意。單獨的,更具體的問題會更合適。 – DesignerGuy

+0

@all我很感謝你的回答。我希望我可以將每個人的回答標記爲「接受」......他們都幫助我很多。 – Moses89

回答

0

問題1:

你很可能會利用php's include。所有頁面都會使用這個。如果用戶未登錄,則將其重定向到登錄頁面。一般而言,這是很好的做法。該文件還可能包含通用功能或其他用戶信息。

問題2:

您不必使用cookies。相反,我會考慮using sessions。在這裏你可以存儲他們是否在服務器端登錄。

問題3:

請在單獨的SO問題中提出此問題。你需要定義「不起作用」的含義。你是否嘗試過調試它?你有什麼嘗試?

+0

感謝您的幫助。有沒有可能向我展示如何使用php的include? – Moses89

+0

這很容易。在您的網站的根目錄下創建一個名爲global.php的文件。然後將'include'/global.php';'添加到任何頁面的頂部。該頁面中的代碼將執行,就像它實際上在每個頁面中一樣。 – mrtsherman

+0

所以在我的特殊情況下,我應該包含'/login.php';在我所有內容頁面的頂部?這是否意味着用戶必須登錄每個頁面? – Moses89

0

我來回答你的第3部分:

按你所編寫的代碼,它會只檢查提供的用戶名與列表中第一個用戶名。如果這些不匹配,則寫入文件並重定向。你看,你沒有檢查整個用戶名列表。

試試這個:

$match_found = false; 

while (($buffer = fgets($fh, 4096)) !== false) 
{ 
    // Parse the line 
    list($usercheck, $passwordcheck) = explode('|', $buffer); 
    if (trim($usercheck) == $username) 
    { 
     print "The username is already in our system. Please use another one."; 
     $match_found = true; 
     break; 
    } 
} 

if(!$match_found) 
{ 
    fwrite($fh, $data); 
    //Redirect to home page 
    Header("Location: index.html"); 
} 
+0

這很好。謝謝!如果您願意,我可以提出另一個問題,並將其標記爲已接受的答案(因爲其他人推薦這是一個問題本身)。只要給我這個詞。 – Moses89

+0

我很高興它有幫助。如果你的問題已經解決了,我認爲不需要另外創建一個問題。乾杯。 – Vikk

0

在問候你的第一個問題,我或許會考慮使用PHP的sessions,以確保只有經過身份驗證的用戶可以看到的網頁。您可以使用一個模型,其中最初使用登錄頁面進行登錄(或者在任何頁面上都有用於將數據發送到PHP登錄頁面的表單)以及用戶需要登錄才能看到的所有頁面可以先檢查他們是否有有效的會話。如果沒有有效的當前會話,則可以使用重定向頭來發送登錄頁面。
一個簡單的實現可能是這樣的任何給定的網頁上:

<?php 
session_start(); 
if($_SESSION['loggedin'] !== 1) { 
    header('Location: login.php'); 
    exit; 
} 
?> 
+0

太棒了!是否有可能包含某種形式的cookie,以便來自同一臺計算機的已登錄的用戶不必? – Moses89