所有人,
预先抱歉-我不是PHP专家,也不是设计模式方面的专家,所以这个问题可能有点基本。。。
无论如何,我正在开发一个需要登录的web应用程序。
我的计划是这样的:
index.php索引:此页将包含一个简单的表单,允许用户输入用户名和密码。表格会将输入张贴到。。。
登录.php:此页将接收来自index.php索引,并根据数据库检查这些凭据。如果缺少任何输入,或者凭据检查失败,php脚本将
重定向
用户返回到index.php索引使用:
header('Location: http://www.mydomain.com/index.php');
如果凭据有效,则登录.php创建会话以建立用户的身份验证状态:
session_start();
$_SESSION['authenticated'] = true;
然后,它确定用户具有什么访问类型。如果他有“level1”访问权限,脚本将使用以下命令将用户重定向到level1.php:
header('Location: http://www.mydomain.com/level1.php');
header('Location: http://www.mydomain.com/level2.php');
最后,当达到level1.php或level2.php时,他们首先要做的是检查会话。如果用户未通过身份验证,请将其重定向回index.php索引:
session_start();
if (!isset($_SESSION['authenticated']) {
header('Location: http://www.mydomain.com/index.php');
} else {
// proceed to display the page
}
我的第一个问题是:这个简单的逻辑在第一次到达level1.php时失败,“isset($_SESSION['authenticated']”
总是
简言之,由于我不明白的原因,这次会议似乎是由登录.phplevel1.php找不到-我假设是因为重定向。换句话说,直到/除非往返于客户端浏览器,否则对level1.php的检查似乎失败。
因为每一个需要登录的站点都已经解决了这个问题,所以这不应该是一个新的挑战,它们应该是一个非常成熟的模式。我该怎么处理?
-
index.php索引-显示要捕获的窗体
凭据,然后将它们发布到
登录.php
-
登录.php-评估用户的
凭证,然后将它们指向
-
level1.php&level2.php-显示
适当的内容
一般来说,如果一个页面建立了会话,然后将用户重定向到另一个页面,那么第二个页面是否可以读取会话?
维基百科上有一个很棒的关于Post/Redirect/Get的页面:
http://en.wikipedia.org/wiki/Post/Redirect/Get
但这对我来说有点概念性——我想看看它是如何通过引用特定页面来解释的:
E、 g.“a页”上的表单将数据发布到“B页”,“B页”将用户重定向到“C页”等。。。
而且,如果在使用重定向时无法识别会话,我也不明白它是如何通过会话实现的。
非常感谢您的建议和见解。
多亏了马特·鲍尔的评论,我对这个问题进行了改进:
登录.php正在设置会话并将用户重定向到下一个屏幕:
session_start();
$_SESSION['authenticated'] = true;
header('Location: http://www.mydomain.com/level1.php');
但是,当level1.php检查该会话时,“authenticated”是
:
session_start();
echo (isset($_SESSION['authenticated']); // returns false
但是,如果我改变了登录.php使标题重定向到
url而不是绝对url:
session_start();
$_SESSION['authenticated'] = true;
header('Location: level1.php');
那么,level1.php的工作方式与我预期的一样:
session_start();
echo (isset($_SESSION['authenticated']); // now returns true
非常感谢所有发表评论的人!
马特·斯图勒