【发布时间】:2014-07-01 21:42:29
【问题描述】:
我在尝试为我的 Web 应用程序实现登录系统时遇到了非常困难的时间。
就我的 index.php 而言,我的基本逻辑正常工作 - 如果用户尝试在那里导航并且没有登录,它会将他们重定向到登录屏幕。一旦他们提供了正确的凭据,他们就会被正确地引导回受保护的 index.php 页面。
代码中的这个逻辑可以在这里看到:
(index.php)
<?php
session_start();
include_once 'db_functions.php';
require_once 'access.php';
if (!userIsLoggedIn()) {
include 'login.php';
exit();
}
当用户尝试导航到另一个受保护的页面时会出现此问题。我的逻辑是让受保护的页面检查用户是否已登录,如果未登录,则将它们发送回索引,然后将它们发送到登录屏幕。
(protectedpage.php)
<?php
session_start();
require_once 'access.php';
echo "Logged in: " + $_SESSION['loggedIn'];
echo "User: " + $_SESSION['email'];
echo "Password: " + $_SESSION['password'];
// receive data from HTML readcalllog request
$rName=$_POST["registration"]; //irrelevant post data
$rowId=$_POST["rowid"]; //irrelevant post data
if ($_SESSION['loggedIn'] == FALSE) {
header('Location: http://www.myapp.com/index.php'); //if not logged in, return to index.php, which in turn redirects to a logon page.
exit();
}
如您所见,我包含了测试回显语句以打印出当前会话的详细信息。当我导航到页面(关闭重定向功能)以检查错误消息时,它将打印"000",而前面没有"Logged in: " 或"User: " 文本。
我执行了一个测试并在 index.php 页面上成功打印了详细信息,因此由于某种原因,当我从 index.php 导航到另一个受保护的页面时会话丢失了。
任何帮助将不胜感激!
编辑:
这是access.php 函数中 userIsLoggedIn() 的一部分,用于设置会话变量:
function userIsLoggedIn()
{
if (databaseContainsAuthor($_POST['email'], $password))
{
session_start();
$_SESSION['loggedIn'] = TRUE;
$_SESSION['email'] = $_POST['email'];
$_SESSION['password'] = $password;
return TRUE;
}
else
{
session_start();
unset($_SESSION['loggedIn']);
unset($_SESSION['email']);
unset($_SESSION['password']);
$GLOBALS['loginError'] =
'The specified email address or password was incorrect.';
return FALSE;
}
}
}
编辑 2: 如果我登录到索引页面,转到受保护的页面(这会将我发送到登录屏幕)并再次登录,会话正常运行并且所有受保护的页面都可以访问。 我只需要弄清楚是什么阻止了初始登录创建一个正确的会话。
【问题讨论】:
-
您的登录信息如何
-
我看到的两个文件之间的唯一区别是
include_once 'db_functions.php';:您确定db_functions.php中没有什么重要的内容,还是您也尝试将其包含在protectedpage.php中? -
这些不是完整的文件,只是适用于会话和登录的部分的 sn-ps。
-
你也应该在受保护的页面中使用
userIsLoggedIn,而不是$_SESSION['loggedIn'] === FALSEtho -
一个请求不要多次使用 session_start。把它放在第一行。不在您的登录功能中。否则会产生通知