关于PHP中用户授权的问题

时间:2011-11-06 03:41:01

标签: php

我正在尝试构建一个简单的用户授权系统,其中.txt文件存储用户名和密码信息。我知道这可能应该以不同的方式完成(通过数据库),但我这样做是为了练习。如果有人能帮助我解决我的问题,我们将不胜感激。

到目前为止,我已经建立了register.php和login.php,但我不知道从哪里开始。以下是我的三个问题:

  1. 假设我有一个我想要保护的html网站。如何合并login.php,以便如果未登录的用户尝试访问页面内容,系统会提示他们登录?我是否必须在每个html页面中添加一些内容?

  2. 如何在此过程中实施Cookie?登录的用户不必重新登录20分钟。理想情况下,我想在用户登录后发送cookie,但我该怎么做?

  3. 我希望我的register.php能够检查现有用户,因此所有名称都是唯一的。到目前为止,我没有正确地做到这一点。我的代码出了什么问题?

  4. 这是我的代码:

    的login.php

    <?php
    
    $check = 0;
    if (isset($_POST['submit']))
    {
    
    $name = htmlentities($_POST['name']);
    $name = strtolower($name);
    $password = htmlentities($_POST['apw']);
    $filename = getcwd() . "/psverification.txt";
    $lines = file( $filename , FILE_IGNORE_NEW_LINES );
    printf ("Hi %s,</br />", $name);
    foreach($lines as $key => $line)
    {
        list($username, $pw) = explode('|', $line);
        if($username == $name && $pw == $password)
    $check++;
    break;  
    }
    if ($check == 1){
    //Redirect to home page
    Header("Location: index.html");
    }
    else{
    printf("Your username or password are invalid. Please try again.");
    
    }
    
    }
    
    ?>
    
    <form method = "POST" action = "<?php echo $_SERVER['PHP_SELF']; ?>">
    <p>
    Username:<br />
    <input type = "text" id="name" name="name" size="20" maxlength="40" />
    </p>
    
     <p>
     E-mail Address:<br />
     <input type = "text" id="apw" name="apw" size="20" maxlength="40" />
     </p>
    
     <input type="submit" id="submit" name ="submit" name ="submit" value="Log in" />
    
     <p>
     <a href="register.php">Register</a></p>
     </form>
    

    REGISTER.PHP

    <?php
    
    if (isset($_POST['submit']))
    { 
    
    $username = $_POST['user'];
    $password = $_POST['password'];
    $confirmpw = $_POST['confirmpw'];
    $username = strtolower($username);
    
    
    //Check if passwords match
    if ($password != $confirmpw){
    print "Passwords do not match, please try again.";
    }
    else{
    //the data
    $data = "$username|$password\n";
    
    //open the file and choose the mode
    
    $fh = fopen("psverification.txt", "a+");
    
     // Cycle through the array
    while (($buffer = fgets($fh, 4096)) !== false)
    {
        // Parse the line
        list($usercheck, $passwordcheck) = explode('|', $buffer);
        if (trim($usercheck) == $username)
     {
     print "The username is already in our system.  Please use another one.";}
    
    else {
    fwrite($fh, $data);
    //Redirect to home page
    Header("Location: index.html");
    }
    
     }
     //close the file
    
    fclose($fh);
    
    
    }
    }
    
    ?>
    
    <form method = "POST" action = "<?php echo $_SERVER['PHP_SELF']; ?>">
     <p>
      Username:<br />
     <input type = "text" id="user" name="user" size="20" maxlength="40" />
     </p>
    
      <p>
      Password:<br />
      <input type = "password" id="password" name="password" size="20" maxlength="40" />
      </p>
    
     Confirm Password:<br />
     <input type = "password" id="confirmpw" name="confirmpw" size="20" maxlength="40" />
     </p>
    
     <input type="submit" id="submit" name ="submit" name ="submit" value="Register" />
     </form>
    

    提前致谢。任何例子都将非常感谢。

3 个答案:

答案 0 :(得分:0)

问题1:

您可能会使用php's include。所有页面都会使用它。如果用户未登录,则将其重定向到登录页面。这是一般的好习惯。该文件还可能包含通用功能或其他用户信息。

问题2:

您不必使用Cookie。相反,我会考虑using sessions。在这里,您将存储它们是否在服务器端登录。

问题3:

在单独的SO问题中提出这个问题。您需要定义“不起作用”的含义。你有没有试过调试它?你有什么尝试?

答案 1 :(得分:0)

我会回答你的第三部分:

根据您编写的代码,它只会使用列表中的第一个用户名检查提供的用户名。如果这些不匹配,请写入文件并重定向。你看,你没有检查整个用户名列表。

试试这个:

$match_found = false;

while (($buffer = fgets($fh, 4096)) !== false)
{
    // Parse the line
    list($usercheck, $passwordcheck) = explode('|', $buffer);
    if (trim($usercheck) == $username)
    {
        print "The username is already in our system.  Please use another one.";
        $match_found = true;
        break;
    }
}

if(!$match_found)
{
    fwrite($fh, $data);
    //Redirect to home page
    Header("Location: index.html");
}

答案 2 :(得分:0)

关于您的第一个问题,我可能会考虑使用PHP的sessions来确保只允许经过身份验证的用户查看该页面。您可以拥有一个模型,其中登录页面最初用于登录(或者在任何页面上有一个表单,用于将数据发送到PHP登录页面),以及用户需要登录才能看到的所有页面可以先检查他们是否有有效的会话。如果没有有效的当前会话,则可以使用重定向标头来发送登录页面 在任何给定页面上,简单的实现可能如下所示:

<?php
session_start();
if($_SESSION['loggedin'] !== 1) {
    header('Location: login.php');
    exit;
}
?>