Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2025, 15:34   #1
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 142
Вопрос Joomla 3.8 - временная группа

PHP 7.0.33

С ChatGPT уже часов 9 задачу бодаю.

Есть группа AdvPoller (наследуемая от Public)
Есть уровень доступа AdvPoller (в нём только группа AdvPoller)

1) Нужно написать плагином или функцией автоматическое присвоение этой группы пользователю с известным IP.

Это реально вообще? ChatGPT выдал где-то, что хранимые в сессии "группы", даже если туда добавить нужную - не влияют на просмотр материалов - нужна именно записанная в БД группа. А зачем тогда вообще группы, хранимые в сессии? Или может всё-таки ChatGPT ошибся?..

2) Разрабатываю уже альтернативный вариант: автоматическая регистрация и авторизация временного пользователя с присвоением ему заданной группы. Пользователь создался, группа AdvPoller по id прописалась. А при заходе на сайт всё равно нет доступа к материалу с уровнем доступа AdvPoller.

Код плагина:
Код:
<?php
defined('_JEXEC') or die;

use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Factory;
use Joomla\CMS\User\UserHelper;

class PlgSystemAdvTempUser extends CMSPlugin
{
    protected $app;

    public function onAfterInitialise()
    {
        // Получаем IP текущего пользователя
        $ip = $_SERVER['REMOTE_ADDR'];
        $db = Factory::getDbo();

        // Проверяем, существует ли пользователь с таким IP
        $query = $db->getQuery(true)
            ->select('id')
            ->from($db->quoteName('#__users'))
            ->where($db->quoteName('username') . ' = ' . $db->quote('temp_' . $ip));
        $db->setQuery($query);
        $userId = $db->loadResult();

        if ($userId) {
            // Пользователь уже существует, авторизуем его
            $this->loginUserById($userId);
            return;
        }

        // Если пользователь не найден, создаем его
        $this->createAndLoginTempUser($ip);
    }

    private function createAndLoginTempUser($ip)
    {
        $db = Factory::getDbo();

        // Генерируем данные для нового пользователя
        $username = 'temp_' . $ip;
        $password = UserHelper::genRandomPassword(); // Генерация случайного пароля
        $passwordHash = UserHelper::hashPassword($password); // Хэшируем пароль
        $email = 'temp_' . str_replace('.', '_', $ip) . '@example.com';
        $name = 'Temporary User (' . $ip . ')';

        // Вставляем нового пользователя в таблицу #__users
        $columns = ['name', 'username', 'email', 'password', 'block', 'sendEmail', 'registerDate'];
        $values = [$db->quote($name), $db->quote($username), $db->quote($email), $db->quote($passwordHash), 0, 0, $db->quote(date('Y-m-d H:i:s'))];

        $query = $db->getQuery(true)
            ->insert($db->quoteName('#__users'))
            ->columns($db->quoteName($columns))
            ->values(implode(',', $values));
        $db->setQuery($query);

        try {
            $db->execute();
            $userId = $db->insertid(); // Получаем ID созданного пользователя
        } catch (Exception $e) {
            die('Ошибка при создании пользователя: ' . $e->getMessage());
        }

        // Добавляем пользователя в группу AdvPoller (ID = 10)
        $query = $db->getQuery(true)
            ->insert($db->quoteName('#__user_usergroup_map'))
            ->columns([$db->quoteName('user_id'), $db->quoteName('group_id')])
            ->values((int) $userId . ', 10');
        $db->setQuery($query);

        try {
            $db->execute();
        } catch (Exception $e) {
            die('Ошибка при добавлении пользователя в группу: ' . $e->getMessage());
        }

        // Авторизуем нового пользователя
        $this->loginUserById($userId);
    }

    private function loginUserById($userId)
    {
        // Загружаем пользователя по ID
        $user = Factory::getUser($userId);

        if ($user->id) {
            // Выполняем авторизацию
            $credentials = ['username' => $user->username, 'password' => null];
            Factory::getApplication()->login($credentials, ['silent' => true]);
            Factory::getApplication()->setUserState('user', $user);
        }
    }
}
?>
Манифест плагина:
Код:
<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" group="system" version="3.8" method="upgrade">
    <name>System - AdvTempUser</name>
    <author>Ваше Имя</author>
    <version>1.0.0</version>
    <description>Плагин для создания временного пользователя по IP и автоматической авторизации.</description>
    <files>
        <filename plugin="advtempuser">advtempuser.php</filename>
    </files>
    <folder>system</folder>
</extension>
hexor_boo вне форума Ответить с цитированием
Старый 21.01.2025, 16:28   #2
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 142
По умолчанию

Краткое, гениальное и не работающее решение...

Код плагина:
Код:
<?php
defined('_JEXEC') or die;

class PlgSystemAdvpolleraccess extends JPlugin
{
    public function onAfterInitialise()
    {
        // Список разрешённых IP-адресов
        $allowedIps = ['192.168.1.100', '203.0.113.42', '127.0.0.1']; // Укажите здесь нужные IP-адреса

        // Получаем текущий IP-адрес пользователя
        $userIp = $_SERVER['REMOTE_ADDR'];

        // Проверяем, совпадает ли IP с разрешёнными
        if (!in_array($userIp, $allowedIps)) {
            return; // Если IP не совпадает, ничего не делаем
        }

        // Получаем текущего пользователя
        $user = JFactory::getUser();

        // Проверяем, есть ли у пользователя уже группа AdvPoller
        $advPollerGroupId = 10; // ID группы AdvPoller (укажите реальный ID вашей группы)
        if (in_array($advPollerGroupId, $user->groups)) {
            return; // Если пользователь уже в группе, ничего не делаем
        }

        // Временно добавляем группу AdvPoller пользователю
        $user->groups[] = $advPollerGroupId;

        // Применяем изменения к объекту пользователя
        JFactory::$session->set('user', $user);
    }
}
?>
Код манифеста:
Код:
<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" group="system" version="3.8" method="upgrade">
    <name>PLG_SYSTEM_ADVPOLLERACCESS</name>
    <author>Your Name</author>
    <creationDate>2023-10-25</creationDate>
    <copyright>Your Company</copyright>
    <license>GNU General Public License</license>
    <version>1.0.0</version>
    <description>Автоматическое добавление группы AdvPoller для пользователей с определённым IP.</description>
    <files>
        <filename plugin="advpolleraccess">advpolleraccess.php</filename>
    </files>
</extension>
hexor_boo вне форума Ответить с цитированием
Старый 21.01.2025, 17:56   #3
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 142
По умолчанию

Автоматическая авторизация по IP автоматически созданного временного пользователя с принадлежностью к заданной группе

Код плагина:
Код:
<?php
defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\User\UserHelper;

class PlgSystemAutoAuthByIP extends JPlugin
{
    public function onAfterInitialise()
    {
        $userIP = $_SERVER['REMOTE_ADDR'];

        // Разрешённые IP-адреса
        $allowedIPs = ['192.168.0.1', '203.0.113.42', '127.0.0.1'];

        if (!in_array($userIP, $allowedIPs)) {
            return;
        }

        $user = Factory::getUser();
        if (!$user->guest) {
            return;
        }

        $username = 'temp_user_' . str_replace('.', '_', $userIP);
        $email = $username . '@example.com';

        $db = Factory::getDbo();
        $query = $db->getQuery(true)
            ->select('id')
            ->from($db->quoteName('#__users'))
            ->where($db->quoteName('username') . ' = ' . $db->quote($username));
        $db->setQuery($query);
        $userId = $db->loadResult();

        if (!$userId) {
            $password = 'TempUser@123'; // Сложный пароль

            $userData = [
                'name' => 'Temporary User',
                'username' => $username,
                'email' => $email,
                'password' => $password,
                'block' => 0,
                'groups' => [10],
            ];

            $user = new JUser;
            if (!$user->bind($userData) || !$user->save()) {
                $errors = $user->getErrors();
                foreach ($errors as $error) {
                    Factory::getApplication()->enqueueMessage('Ошибка создания пользователя: ' . $error, 'error');
                }
                return;
            }

            $userId = $user->id;
        }

        // Авторизация пользователя вручную
        $user = Factory::getUser($userId);

        Factory::getApplication()->setUserState('user', $user);
        Factory::getSession()->set('user', $user);

        // Устанавливаем дату последнего визита
        $user->setLastVisit();
    }

}
?>
Код манифеста:
Код:
<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" group="system" version="3.8" method="upgrade">
    <name>System - AutoAuthByIP</name>
    <author>Your Name</author>
    <creationDate>2023-10-30</creationDate>
    <copyright>Your Company</copyright>
    <license>GNU General Public License</license>
    <version>1.0</version>
    <description>Automatically creates and logs in users based on their IP address.</description>
    <files>
        <filename plugin="autoauthbyip">autoauthbyip.php</filename>
    </files>
    <folder>system</folder>
</extension>
hexor_boo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где эта Временная папка? Yaga Свободное общение 12 04.10.2010 18:39
Временная таблица Ivol Microsoft Office Access 4 26.08.2010 14:43
Временная задержка zleyshiy Общие вопросы Delphi 4 14.08.2009 08:15
Временная таблица Tomatos БД в Delphi 10 31.05.2009 14:45