如何实现"Log In First To Access Webpage"?

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

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

基本上,我使用的是 API,所以查看内容的唯一可能是无论如何都要登录,但是我仍然想说 "Log In First To see Your Data" 而不是只显示一个没有任何内容的空白页面。

你能给我一些想法吗?

我想到了这样的事情:

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

这很简单,但我需要看一些代码,有点像这样 如果($loggedin == TRUE){ 显示页面 } 别的 { 不显示页面 }

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

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

完成此 link:Simple Login Appliction using PHP

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

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

创建 logd_user.php 文件

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

如果用户没有登录,它应该显示 "Log in first to see your data",以及一个供用户登录的表单。

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

我可以给你完整的代码

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

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

有很多方法可以处理您的情况,但我会这样做:

<?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来处理这种问题很像重定向用户,但仍然返回he/she想要的内容。使用 Charles Proxy,我可以将他的 302 redirect 重写为 200 OK,然后查看整个管理面板。如果您使用 showhide,未经授权的用户可以只查看 HTML 源,并且仍然可以看到他们不应该看到的所有内容。

这就是为什么当用户试图在未经适当身份验证的情况下访问页面时必须调用 die()exit() 的原因。

作为附加说明:您不必将用户重定向到登录或错误页面,只要您调用 die( <some message telling them they must login> );。我的例子重定向只是因为我个人的喜好。