2012-01-25 21 views
9

Tôi hiện đang làm việc trên trang web có đăng nhập (tên người dùng và mật khẩu) - Bảo vệ bằng mật khẩu được thực hiện bởi hệ điều hành trong máy chủ web ở cấp thư mục được gọi là Vương quốc trong hệ điều hành. Bây giờ điều này sẽ phải làm, cho đến khi chúng ta tìm ra một hệ thống đăng nhập PHP thích hợp.PHP Session Destroy on Log Out Button

Đoạn code dưới đây, dựa trên một previous question on the stack overflow.

Tôi đang sử dụng 3 tác phẩm (Xem đoạn mã ở phía dưới).

Quy trình là: - Nhấp vào nút Đăng nhập trên index.php - Nhập tên người dùng và mật khẩu để truy cập tệp chỉ mục xác thực. - Nhấp vào nút đăng xuất, tham chiếu đến tệp logout.php - nó NÊN xóa bộ nhớ cache và đưa người dùng trở lại chỉ mục cấp cao nhất.

Nó không 'phá hủy phiên' theo nghĩa là bạn không được yêu cầu nhập lại mật khẩu khi được nhắc đến, về cơ bản những gì tôi muốn xảy ra.

Kiến thức tối thiểu về php của tôi khiến tôi hơi bối rối ở đây.

index.php (tập tin cấp cao nhất với bản ghi trong nút)

<?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> 

xác thực/index.php (Thư mục này được mật khẩu bảo vệ - chứa các tập tin chỉ mục với các bản ghi ra nút đó liên kết đến tập tin 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> 

xác thực/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

Nếu thư mục được bảo vệ mật khẩu, sau đó PHP được không làm xác thực. Apache (hoặc máy chủ web) là. – xbonez

+0

Điều đó có ý nghĩa, cảm ơn rất nhiều @xbonez – fitzilla

Trả lời

22

Thư mục được bảo vệ bằng mật khẩu có không có gì để làm với PHP!

Phương thức được sử dụng được gọi là "Xác thực cơ bản". Không có cách nào để "đăng xuất" qua trình duyệt, ngoại trừ yêu cầu người dùng đóng và sau đó mở trình duyệt của họ ...

Đây là cách bạn có thể thực hiện trong PHP thay thế (xóa hoàn toàn xác thực cơ bản Apache của bạn) trong .htaccess hoặc bất cứ nơi nào nó là đầu tiên):

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>'; 

Rõ ràng đây là rất triển khai cơ bản. Bạn mong muốn tên người dùng và mật khẩu nằm trong cơ sở dữ liệu, không phải là so sánh được mã hóa. Tôi chỉ cố gắng cung cấp cho bạn một ý tưởng về cách thực hiện điều này.

Hy vọng điều này sẽ giúp bạn hiểu những gì đang xảy ra.

+0

Thật tuyệt vời! Tốt hơn nhiều so với phương thức xác thực HTTP, trong đó mã đăng xuất phức tạp hơn nhiều. Nếu bạn sẽ thêm các thẻ đóng PHP trong cả ba khóa mã, tôi sẽ trả lời bạn. Rất tiếc, tôi đã làm! :-) –

+1

@FrankConijn Vui lòng xem http://php.net/manual/en/language.basic-syntax.phptags.php: "Nếu tệp là mã PHP thuần túy, bạn nên bỏ qua thẻ đóng PHP tại Điều này ngăn chặn các khoảng trống ngẫu nhiên hoặc các dòng mới được thêm vào sau thẻ đóng PHP, điều này có thể gây ra các hiệu ứng không mong muốn vì PHP sẽ bắt đầu đệm đầu ra khi không có ý định từ lập trình viên gửi bất kỳ đầu ra nào vào thời điểm đó trong tập lệnh. " – stackunderflow

+0

Tôi nghĩ rằng việc đăng xuất nên được thực hiện bằng cách sử dụng phương pháp bài, không nhận được. – chespinoza

3

Trước tiên hãy cung cấp liên kết của logout.php trang trong nút đăng xuất đó.Trong trang đó làm cho đoạn code đó được đưa ra dưới đây:

Đây là mã:

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

Khi phiên đã bắt đầu, các phiên làm việc cho người sử dụng cuối cùng/hiện tại đã được bắt đầu, do đó, không cần để khai báo tên người dùng. Nó sẽ bị xóa tự động theo phương thức session_destroy.

0

// logout

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

?>

+0

Cảm ơn bạn đã trích đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp ngắn hạn có giới hạn. Một lời giải thích thích hợp [sẽ cải thiện rất nhiều] (// meta.stackexchange.com/q/114762) giá trị lâu dài của nó bằng cách hiển thị * tại sao * đây là một giải pháp tốt cho vấn đề, và sẽ làm cho nó hữu ích hơn cho người đọc trong tương lai các câu hỏi tương tự khác. Vui lòng [sửa] câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện. –