Как я могу добавить уровни пользователя / доступа к моему текущему сценарию входа? - PullRequest
1 голос
/ 01 ноября 2011

В настоящее время я изучаю PHP и MySQL, и я работаю с базовым (хотя и старым) учебником по сценариям входа в систему - я сталкивался с различными устаревшими функциями и тому подобным, и я пытаюсь улучшить этот сценарий.

Я хотел бы добавить разные уровни доступа к моему сценарию, например администраторы и пользователи. Я добавил в свою таблицу «пользователи» строку с именем «доступ», в которой доступ будет «1» для пользователей и «9» для администраторов.

После некоторого первоначального исследования мне кажется, что мне нужно сохранить уровень доступа пользователей в переменной сеанса - это правильный путь? Если да, то как мне получить это изначально, когда пользователь входит в систему?

Как только уровень доступа будет сохранен в переменной сеанса, как я смогу ограничить доступ к страницам - возможно, используя перенаправления заголовков?

Это текущий код, с которым я работаю из functions.php

function checkLogin()
    {
    /* Check if user has been remembered */
    if(isset($_COOKIE['cookname']) && isset($_COOKIE['cookpass'])){
        $_SESSION['username'] = $_COOKIE['cookname'];
        $_SESSION['password'] = $_COOKIE['cookpass'];
    }

    /* Username and password have been set */
    if(isset($_SESSION['username']) && isset($_SESSION['password']))
    {
    /* Confirm that username and password are valid */
    if(confirmUser($_SESSION['username'], $_SESSION['password']) != 0)
    {
    /* Variables are incorrect, user not logged in */
        unset($_SESSION['username']);
        unset($_SESSION['password']);
        return false;
    }
        return true;
    }
    /* User not logged in */
    else
    {
      return false;
    }
    }

А из login.php

if(isset($_POST['sublogin'])){
   /* Check that all fields were typed in */
   if(!$_POST['user'] || !$_POST['pass']){
      $errors .= "You didn't fill in a required field.<br/>\n";

   }


else{

    /* Once all fields are entered - perform form validation */


   /* Checks that username is in database and password is correct */
   $md5pass = md5($_POST['pass']);
   $result = confirmUser($_POST['user'], $md5pass);

   /* Check error codes */
   if($result == 1){
      $user_errors .= "That username doesn't exist in our database.<br/>\n";
   }
   else if($result == 2){
      $pass_errors .= "Incorrect password, please try again.<br/>\n";
   }


   /* Username and password correct, register session variables */
   if (empty($errors) && empty($user_errors) && empty($pass_errors)){
        $_POST['user'] = mysql_real_escape_string($_POST['user']);
        $_SESSION['username'] = $_POST['user'];
        $_SESSION['password'] = $md5pass;
        /* Quick self-redirect to avoid resending data on refresh */
        echo "<META HTTP-EQUIV='refresh' CONTENT='0;URL=index.php'>";
   } 



   /**
    * This is the cool part: the user has requested that we remember that
    * and one to hold his md5 encrypted password. We set them both to
    * he's logged in, so we set two cookies. One to hold his username,
    * expire in 100 days. Now, next time he comes to our site, we will
    * log him in automatically.
    */
   if(isset($_POST['remember'])){
      setcookie("cookname", $_SESSION['username'], time()+60*60*24*100, "/");
      setcookie("cookpass", $_SESSION['password'], time()+60*60*24*100, "/");
    }

    //return;
}
}

Любая помощь будет очень признательна, так как я застрял на этом в течение нескольких дней, спасибо.

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Таким образом, этот пример предполагает, что вы проверяете ограничение ресурсов для ролей в вашем PHP, а не из БД.Это можно легко изменить, но я подумал, что сделаю это немного проще.

Схема:

users
-------
id_user
identity
credential
role
... other fields

Создание аккаунта

не используйте md5,его легко реализовать и легко преодолеть.Ша просто немного безопаснее, без дополнительной работы.

$email_or_username = "francis@yaconiello.com";
$password = "PinkEleph4nt"; // not my real password for anything
$role = "admin";
$sql = sprintf("INSERT INTO users SET identity='%s', credential='%s', role='%s'",
    mysql_real_escape_string($email_or_username), 
    mysql_real_escape_string(sha1($password)), 
    mysql_real_escape_string($role));

Вход в учетную запись

Это сокращено, я бросил запрос, но не слишком много логики БД, запишите его какнеобходимо, прочитайте комментарии.

// VALIDATE THE EMAIL/USERNAME and PASSWORD

if($is_valid == TRUE)
{
    $sql = sprintf("SELECT id_user FROM users WHERE identity='%s' AND credential='%s' LIMIT 1",
        mysql_real_escape_string($email_or_username), 
        mysql_real_escape_string(sha1($password)));

    // FETCH ROW save into $row

    if(!empty($row))
    {
        // A user was fetched save it into the session
        $_SESSION['id_user'] = $row['id_user'];

        // SUCCESS
    }
    else
    {
        // FAILURE
    }
}

Проверьте роль пользователя

<?php
function fetch_role()
{
    $role = "guest";
    if(isset($_SESSION['id_user']))
    {
        // User exists
        $sql = sprintf("SELECT * FROM users WHERE id_user='%s' LIMIT 1",
            mysql_real_escape_string($_SESSION['id_user']));

        // RUN THE MYSQL QUERY TO FETCH THE USER, SAVE INTO $row

        if(!empty($row))
        {
            $role = $user_row['role'];
        }
    }

    return $role;
}

...

$role = fetch_role();
if($role == 'guest')
{
    // SHOW GUEST CONTENT
}
elseif($role == 'member')
{
    // SHOW OTHER CONTENT
}
elseif($role == 'admin')
{
    // SHOW ADMIN CONTENT
}
1 голос
/ 01 ноября 2011

Назначьте разные идентификаторы ролей разным типам пользователей в вашей пользовательской таблице.Иметь контекстную таблицу, в которой будет храниться информация о различных путях к файлам (предпочтительно самый верхний уровень требуемой иерархии в папке).И таблица, содержащая сопоставление между ролями и различными путями к файлам (то есть, какому типу пользователей разрешен доступ к какому пути)Теперь в верхней части ограниченных файлов есть метод util, который будет принимать путь __FILE__ и идентификатор роли и сообщать, есть ли у пользователя разрешение на доступ или нет, и, таким образом, предпринимать соответствующие действия.Таким образом, вам нужно только сохранить идентификатор роли в переменной сеанса.

...