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

Tatsuhiro

Новичок
Добрый день.
Прошу помощи в следующей вопросе. Опишу ситуацию что делаю.
Создаю 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 пользователей? Надо ли это вообще :) ?
 

AnrDaemon

Продвинутый новичок
Какое отношение подключение к БД имеет к пользователям приложения?
У тебя пользователи имеют возможность выполнять произвольные SQL запросы?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Tatsuhiro, права доступа в твоем случае надо разделять на уровне приложения, проверяя кто есть кто и может ли он читать/писать что либо
 

Tatsuhiro

Новичок
@Tatsuhiro, права доступа в твоем случае надо разделять на уровне приложения, проверяя кто есть кто и может ли он читать/писать что либо
Да, это у меня реализовано.
А если возвратиться к теме - в каком случае добавляются пользователи на уровне БД и там разграничивают права?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Tatsuhiro, точно не в твоем. Механизм может быть применим, чтобы дать какой-то еще площадке доступ к базе с отдельными привилегиями, но это теория.
 
Сверху