有一个 PHP 重定向到登录页面,而不是强制登录

Posted

技术标签:

【中文标题】有一个 PHP 重定向到登录页面,而不是强制登录【英文标题】:Have a PHP redirect to login page, not forcing login 【发布时间】:2013-03-21 16:45:22 【问题描述】:

我创建了一个用于游戏服务器管理的小型 php 站点,但它不会强制未登录的用户登录。如果会话未激活,我添加了重定向,并在注销时销毁了会话。该网站在这里http://zelware.co.uk/gameman

它会强制您第一次登录,但如果您从 URL 中删除 login.php,它会允许您再次进入主区域。任何帮助将不胜感激,谢谢!

【问题讨论】:

没有您的一些代码或您尝试过的代码(特定于代码),我们几乎无法为您提供帮助。 如果你有会话+重定向代码,它可能有助于调试 然后检查每个页面上的会话,并显示一些您尝试过的与此相关的代码,因为您可能在某个地方搞砸了。 虽然我试过你的网址,我显然是自动登录的,但无法注销。肯定有问题。 【参考方案1】:

你需要一个带有

的 if 语句
$_SESSION['loggedin']==TRUE; 

检查是否有人登录。 还可以考虑设置 session_id() 并使用此重定向。

【讨论】:

这太糟糕了,每个人都可以使用工具创建会话,因此仅登录 = true 是最不安全的登录身份验证方式...... 不!那是一种误解。我没有说以上。【参考方案2】:

要对用户进行身份验证,您需要一个简单的机制:

所有页面都应该受到检查的保护,该检查会查找一些会话值,如果该值不存在,则重定向到登录页面。您可以在单独的函数/文件中编写此检查的代码,并在您网站的每个页面中调用/包含它。

is_user_logged_in()
    return $_SESSION['logged_in']; // it is a boolean value, which should be set TRUE by the login function


//in every page of yours you should call this
if ( !is_user_logged_in() )
    //redirect to you login page
    header("Location: http://yoursitename.com/login_page.php");

登录页面应验证用户名/密码,如果有效,则在每个其他页面中创建您要检查的会话值。

if ( valid_user($username, $password) )
    // this is the value you should check for in other pages
    $_SESSION['logged_in'] = TRUE;
    // you may also need to store other user-related info in the session
    $_SESSION['user'] = array("id" => 1 , "username" => "test_user") // a data array from DB

注销页面应该破坏您在其他所有页面中检查的会话值。

unset($_SESSION['logged_in']);
session_destroy();

【讨论】:

【参考方案3】:

您需要创建一种机制来验证用户是否已登录。 登录时,系统会设置一个会话 cookie - 一个随机的、唯一的散列。哈希值以 cookie 的形式存储在数据库中,以及用户名、密码、IP 和登录时间。

当用户访问页面时,您调用的函数看起来有点像这样:(不完全是,这不是很好,只是基本检查,您还应该检查 IP 是否匹配以及会话是否已过期)

  function verify_login() 
 //
 $hash = $_COOKIE['loginhash'];
    if($hash != ''):
        $hash = mysql_real_escape_string($hash);
        $sql = "SELECT * FROM session WHERE hash = '$hash'";


    else:
        header('Location: login.php');
    endif;



    $res = mysql_query($sql) or die(mysql_error());

    if(mysql_num_rows($res) !=0):
    while($row = mysql_fetch_assoc($res)) 
                                    echo 'The user is logged in.';


    
    else:
        header('Location: login.php');
    endif;

      

【讨论】:

以上是关于有一个 PHP 重定向到登录页面,而不是强制登录的主要内容,如果未能解决你的问题,请参考以下文章

项目一众筹网02_2_管理员登录(转发改成重定向到主页面退出登录(转发和重定向的区别强制session失效invalidate)新建jsp模板

如何在 PHP 中登录页面后将用户重定向回所需的 URL?

登录后重定向到请求的最后一页

使 Web API 身份验证返回 401 而不是重定向到登录页面

在 Drupal 的 UberCart 结帐期间重定向到注册页面而不是登录页面?

如果匿名用户无权访问 URL,如何将他们重定向到自定义页面而不是登录页面?