Создание некскольких соединений с БД для разных пользователей

Европа - быстрые серверы на дисках NVMe от $5 / Русский датацентр от 199руб

Тема в разделе "PHP & Postgres", создана пользователем Tatsuhiro, 2 окт 2018.

  1. Tatsuhiro

    Tatsuhiro Новичок

    Сообщения:
    4
    Ваш город:
    Нижний Новгород, Нижегородская область, Россия
    Address:
    Nizhny Novgorod, Russia
    Country:
    Location on Map:
    Добрый день.
    Прошу помощи в следующей вопросе. Опишу ситуацию что делаю.
    Создаю CMS для учета сотрудников организации, где будут учитываться сами сотрудники (ФИО, логин, пароль). Будут три типа пользователей: админ, локальный админ и пользователь.
    Админ - имеет доступ на любые действия.
    Локальный админ - на просмотр, добавление и изменение записей только в одной таблице.
    Пользователь - на просмотр записей только в одной таблице.

    Задача - мониторить текущее подключение пользователя (отображать подключен он или нет). Пользователей кто подключаться будет много (более 100).

    Что я сделал:
    • зашел на сервер PostgreSQL через аккаунт postgres
    • создал новую роль/группу mega_admin, дал ему полные права (суперпользователь, создание ролей и прочее)
    • создал новую роль anton, присвоил пароль 12345, добавить ее в группу mega_admin
    • перелогинился от имени записи anton
    • создал таблицу users (где будут учитываться сотрудники)
    • добавил новую запись: ФИО - Иванов Антон Иванович, логин - anton, пароль - 12345
    • добавил новую группу/роль local_admin, дал ей право на просмотр, добавление и изменение записей в таблице users
    • добавить новую роль - kirill, пароль - 98765 и отпределил ей группу local_admin
    • добавил запись в таблице users: ФИО - Кириллов Кирилл, логин - kirill, пароль - 98765
    Таким образом в БД числятся две моих роли - mega_admin, anton, local_admin, kirill
    Если залогиниться на сервере под учеткой anton или kirill - вопросов нет.

    Теперь страницы админки.
    Как я делал это ранее.
    Три файла: index.php, login.php, db_conn.php

    Структура файла db_conn.php:
    Код:
    <?php $connInfo = pg_pconnect("host='localhost' port='5432' dbname='mainbase' user='anton' password='12345'");
    // Проверка соединения
    if(pg_connection_status($connInfo) !== PGSQL_CONNECTION_OK) {
       die("Ошибка соединения с базой данных. Обратитесь к системному администратору.");
    }?>
    Структура файла login.php:
    PHP:
    <?php
    // Подключаем файлы
    require_once("inc/session.php"); // файл с сессией
    require_once("inc/globals.php"); // файл с глобальными переменными
    require_once("inc/db_conn.php"); // файл подключения

    // скрипт входа
    if (isset($_POST['action']) && $_POST['action'] =="enter") {
    // формируем переменные
    $u_name $_POST["login"]; // имя пользователя
    $u_password $_POST["pass"]; // пароль
    $query  "SELECT * ";
    $query .= "FROM " TABLE_USERS "";
    $query .= "WHERE user_login = '{$u_name}' AND user_password = '{$u_password}' ";
                
    $user_set pg_query($connInfo$query);
                
    if(
    $user pg_fetch_assoc($user_set)){
              
    $_SESSION["worker_id"] = $user["user_id"]; // ID пользователя
    }
    redirect_to(index.php);
    }
    ?>
    <html lang="ru">
        <head>
        </head>
        <body>        
            <header class="header">
            </header>
            
            <main class="main">
                
                <div class="content">
                    <form action="" class="general" method="post">
                    <div class="column1">Вход</div>
                    <div class="column2" >
                        <table class="form" border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td><label for="login">Логин</label><span class="ness">*</span></td>
                                    <td>
                                        <input type="text" name="login" required="required" />
                                    </td>
                                </tr>
                                <tr>
                                    <td><label for="pass">Пароль:<span class="ness">*</span></label></td>
                                    <td>
                                        <input type="password" name="pass" required="required" />
                                        
                                    </td>
                                </tr>
                            </tbody>
                            <tfoot>
                                <tr>
                                    <td colspan="2"><button type="submit" name="action" value="enter" >войти</button></td>
                                </tr>
                            </tfoot>
                        </table>
                    </div>
                </form>
                </div>
            </main><!-- .main-->
        </body>
    </html>
    Подключаем файл db_conn.php.
    Здесь форма входа. Форма из двух полей - имя пользователя, пароль.
    Форма отправляет на эту страницу.
    Проверяем что форма отправлена и делаем запрос в таблицу users.
    Если найден такой пользователь, то добавляем данные о пользователе в сессию и происходит редирект на страницу index.php

    Структура страницы index.php:
    PHP:
    <?php
    // подключаем файлы
    require_once("inc/session.php"); // файл для сессии
    require_once("inc/globals.php"); // файл с глобальными переменными
    require_once("inc/functons.php"); // файл функций Открытой части
    require_once("inc/db_conn.php"); // файл подключения к БД

    // проверяем наличие данных о пользователе в сессии
    checkUserInSession($_SESSION["worker_id"]);


    // скрипт входа
    if (isset($_POST['action']) && $_POST['action'] =="enter") {
    // формируем переменные
    $u_name $_POST["login"]; // имя пользователя
    $u_password $_POST["pass"]; // пароль
    $query  "SELECT * ";
    $query .= "FROM " TABLE_USERS "";
    $query .= "WHERE user_login = '{$u_name}' AND user_password = '{$u_password}' ";
                
    $user_set pg_query($connInfo$query);
                
    if(
    $user pg_fetch_assoc($user_set)){
              
    $_SESSION["worker_id"] = $user["user_id"]; // ID пользователя
    }
    redirect_to(index.php);
    }
    ?>
    <html lang="ru">
        <head>
        </head>
        <body>        
            <header class="header">
            </header>
            
            <main class="main">
                
                <div class="content">
                    <form action="" class="general" method="post">
                    <div class="column1">Вход</div>
                    <div class="column2" >
                        <table class="form" border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td><label for="login">Логин</label><span class="ness">*</span></td>
                                    <td>
                                        <input type="text" name="login" required="required" />
                                    </td>
                                </tr>
                                <tr>
                                    <td><label for="pass">Пароль:<span class="ness">*</span></label></td>
                                    <td>
                                        <input type="password" name="pass" required="required" />
                                        
                                    </td>
                                </tr>
                            </tbody>
                            <tfoot>
                                <tr>
                                    <td colspan="2"><button type="submit" name="action" value="enter" >войти</button></td>
                                </tr>
                            </tfoot>
                        </table>
                    </div>
                </form>
                </div>
            </main><!-- .main-->
        </body>
    </html>
    В функции checkUserInSession проверяем, что в сессии есть ID пользователя и если нет, то редирект на страницу login.php

    Если подключение происходит для одного пользователя - anton и в форму на странице login.php ввести данные этой записи, то всё нормально и подключение проходит на ура. НО только для пользователя anton.

    Если я в форму ввожу данные учетки kirill (локального админа), то тоже подключение происходит. НО. Подключение к БД идет от пользователя anton, т.к. anton указан в файле db_conn.php.

    Поэтому вопросы:
    Если мне надо мониторить подключение пользователей и anton и kirill, то я должен сделать подключение для каждого из с этих пользователей? Если да, то как? Как написать функцию на подключение каждого из пользователей?
    Это сильно будет нагружить сервер? Если подключаться одновременно будет более 200 пользователей? Надо ли это вообще :) ?
     
  2. AnrDaemon

    AnrDaemon Продвинутый новичок

    Сообщения:
    4.641
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Какое отношение подключение к БД имеет к пользователям приложения?
    У тебя пользователи имеют возможность выполнять произвольные SQL запросы?
     
  3. Tatsuhiro

    Tatsuhiro Новичок

    Сообщения:
    4
    Ваш город:
    Нижний Новгород, Нижегородская область, Россия
    Address:
    Nizhny Novgorod, Russia
    Country:
    Location on Map:
    Нет
     
  4. AnrDaemon

    AnrDaemon Продвинутый новичок

    Сообщения:
    4.641
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Тогда что за фигня?
     
  5. c0dex

    c0dex web.dev 2002-... Команда форума Партнер клуба

    Сообщения:
    7.718
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    @Tatsuhiro, права доступа в твоем случае надо разделять на уровне приложения, проверяя кто есть кто и может ли он читать/писать что либо
     
  6. Tatsuhiro

    Tatsuhiro Новичок

    Сообщения:
    4
    Ваш город:
    Нижний Новгород, Нижегородская область, Россия
    Address:
    Nizhny Novgorod, Russia
    Country:
    Location on Map:
    Да, это у меня реализовано.
    А если возвратиться к теме - в каком случае добавляются пользователи на уровне БД и там разграничивают права?
     
  7. c0dex

    c0dex web.dev 2002-... Команда форума Партнер клуба

    Сообщения:
    7.718
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    @Tatsuhiro, точно не в твоем. Механизм может быть применим, чтобы дать какой-то еще площадке доступ к базе с отдельными привилегиями, но это теория.
     
  8. Tatsuhiro

    Tatsuhiro Новичок

    Сообщения:
    4
    Ваш город:
    Нижний Новгород, Нижегородская область, Россия
    Address:
    Nizhny Novgorod, Russia
    Country:
    Location on Map:
    Понял, спасибо.