如何实现“先登录访问网页”


How to implement a "Log In First To Access Webpage"?

基本上,我的网站上有一些页面,我只想在用户登录时显示。然而,我唯一的想法是使用 Bootstrap 来做,并在 PHP 中说如果用户登录了类应该show(显示内容),否则hide..但我不认为这是一个好方法。(显示和隐藏是 Bootstrap 中的类)

基本上我正在使用API,因此查看内容的唯一可能性是登录,但是我仍然想说"先登录以查看您的数据",而不是只显示一个没有任何内容的空白页面。

你能给我一些想法吗?

我想到了这样的事情:

<?php echo $isLoggedIn ? "Welcome, ". $user['first'] : "LOG IN FIRST"; ?>

我真的不能说我喜欢这里的任何答案,所以我觉得有必要提供我自己的答案。

我在您的评论中看到您有办法检查某人是否已登录。因此,您已经奠定了基本的基础。实际上,您发布的代码是您应该做什么的基本思想。毕竟,编程是基于真/假逻辑的。但是,很明显,三元运算符不是处理此问题的最佳方法。

有很多

方法可以处理您的情况,但这是我的做法:

<?php
/* ... your check if the user is logged in, includes, etc. */
// Request that the client disable caching:
header("Cache-control: no-store, no-cache, must-revalidate");
header("Expires: " . gmdate("D, d M Y H:i:s", (time() + 2)) . " GMT");
header("Date: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Pragma: no-cache");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// Check if the user is allowed to access the content:
if( false == $isLoggedIn ){
    // the user is not logged in and no private data should be shown
    header("Location: /login.php?error=" . urlencode("You must login to access the content."),
           true, // override any previously set Location header
           302 // inform the client/browser that this redirect is temporary and should not be cached as a permanent action
          );
    die("You must login <a href='/login.php?error=" . urlencode("You must login to access the content.") . "'>here</a>.");
}
// If the script is executing at this point, we know the user is logged in.
/* ... Your code for handling the API ... */
?>

这里的重要关键是die()函数。此函数可防止脚本进一步执行。在某种程度上,你可以把它想象成一个函数的 return 语句。如果函数中执行了 return 语句,则该 return 语句之后的任何代码都不会执行。这里也是同样的原理。如果不允许用户在该位置,则发回有关错误的一些信息(在本例中为重定向和短消息),然后终止所有进一步的执行。否则,重定向和终止都不会发生。

综上所述,重要的是您不要只使用showhide来处理未经授权的访问尝试。我之前已经对一些网站进行了渗透测试(主要是为我的一个朋友),这与他正在做的事情相似。就他而言,他有一个只有管理员才能访问的管理页面。如果用户在未经管理员权限的情况下访问该页面,他会发送 302 重定向回登录页面,在该页面中他显示一条错误消息,指出用户没有足够的权限来访问管理页面。但是,就像简单地使用showhide一样,他仍然在页面正文中发回了管理员控制面板,但由于重定向到登录页面,未经授权的用户将看不到管理面板。

设置showhide来处理此类问题很像重定向用户,但仍发回他/她想要的内容。使用Charles Proxy,我可以将他的302 redirect重写为200 OK,然后查看整个管理面板。如果您使用 showhide ,未经授权的用户只能查看 HTML 源代码,并且仍然可以看到他们不应该看到的所有内容。

这就是为什么当用户尝试在没有正确身份验证的情况下访问页面时,必须调用die()exit()

另外需要注意的是:您不必将用户重定向到登录或错误页面,只需调用die( <some message telling them they must login> );即可。我的例子重定向只是因为我的个人喜好。

将以下内容放在要限制为非登录成员的任何页面的顶部

<?php
session_start();
include_once "logd_user.php";
?>

创建logd_user.php文件

在logd_user.php文件中,您可以创建一个变量来保存用户名和密码(也就是说,如果您希望所有用户使用相同的用户名和密码登录,否则将用户名和密码存储在MySQL数据库表中)。

如果用户未登录,则应显示"先登录以查看您的数据",以及供用户登录的表单。

处理logd_user.php文件,让我看看你能想出什么。

我可以给你完整的代码

由于您使用的是 php,请按照以下步骤操作:

  • 创建注册表单
  • 在会话中保存用户名和密码
  • 然后将用户重定向到登录表单
  • 现在用户可以使用他的凭据登录。登录后,在会话中存储一个值。
  • 通过使用此标识符,使您的用户永久登录。
  • 注销时,清除会话值并重定向到注销页面。

浏览此链接: 使用 PHP 的简单登录应用程序

这很简单,但我需要看到一些代码,有点像这样If($loggedin == TRUE) {显示页面} 否则 {不显示页面}