Перейти к содержимому
Русский язык для Invision Community 5

Доступ к закрытому форуму внешним модулем (подробно в тексте)

Моя версия IPB:3.1.4

 

Доброго времени суток.

 

Поиском я пользуюсь всегда, но вот для этой идеи даже поисковый запрос сложно придумать, одним словом - не нашел.

 

Собственно что требуется - открывать доступ к закрытому форуму внешним модулем.

То есть имеем закрытый для пользователей форум, в который они могут попасть, при определенном условии, выполняемом на сайте.

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

 

Помогите пожалуйста написать модуль или найти готовое решение.

 

Как я себе это представляю:

На форуме имеется возможность ограничить доступ по паролю.

Хотелось бы что бы при попытке доступа пользователя в этот форум, до запроса пароля форум бы обращался к некому файлу (autopass.php), куда будет передаваться id того форума ($pass_forum_id), к которому пользователь хочет получить доступ. Файл в результате обработки запроса будет выдавать отказ ($auto_pass_ok=false) или разрешение ($auto_pass_ok=true) на доступ.

В результате, если доступ разрешон, то пользователь попадает в форум, минуя запрос пароля.

Если же доступ запрещен происходит запрос пароля или просто запрет на доступ (это уже как проще сделать).

 

Реализовать через выдачу пользователю пароля - не вариант, поскольку пароль быстро станет известен всем, а это полностью лишает идею смысла.

Через группы - очень сложно, поскольку это несколько десятков групп и несколько сотен пользователей, а доступ надо выдавать и запрещать регулярно, что может только админ.

 

Заранее благодарен.

Рекомендованные сообщения

Сделайте его видимым только для определенной группы, при выполнения условий на сайте установите ее как дополнительную.

 

к которому пользователь хочет получить доступ. Файл в результате обработки запроса будет выдавать отказ ($auto_pass_ok=false) или разрешение ($auto_pass_ok=true) на доступ.

На каких оснований файл будет давать отказ или подтверждать доступ для конкретного пользователя?

Можете завести таблицу, записывать туда ид мемберов которые имеют доступ к форуму. При заходе в форуме смотрим нашу таблицу, если имеет доступ - пускаем, нет - просим оправить 20 руб на короткий номер смс.

То же самое что и группой. За то с ней не придется писать еще и хук для проверки доступа.

 

Через группы - очень сложно, поскольку это несколько десятков групп

Не важно сколько их, вы создаете только одну и устанавливайте как дополнительную.

  • Автор
На каких оснований файл будет давать отказ или подтверждать

На основании id форума и id пользователя, сверяется с таблицей и смотрит, разрешон ли пользователю id доступ к форуму id.

Можете завести таблицу, записывать туда ид мемберов которые имеют доступ к форуму

Примерно так, только форум не один, и соответственно в таблице указаны id пользователя и id форума.

 

Честно говоря не понял...

 

Вот есть форумы "Форум1"(id 1) и "Форум2" (id 2), я делаю группу "доступ", для которой создаю маску и прописываю этой группе доступ к этим двум форумам.

Сталю эту группу пользователям, как дополнительную.

 

А дальше?

 

Есть у меня 3 пользователя.

Есть таблица в которой записи, что

пользователь id 1 имеет доступ к форуму id 1

пользователь id 2 имеет доступ к форуму id 2

про третьего пользователя данных нет, значит не имеет доступа ни к одному форуму

 

как реализовать

При заходе в форуме смотрим нашу таблицу, если имеет доступ - пускаем, нет...

 

Я не настолько разбираюсь в php и форуме :(

Сталю эту группу пользователям, как дополнительную.

А дальше?

А дальше то, что только пользователи с этой группой смогут просматривать форум выполнив определенные действия. Что и требуется по задаче.

 

Варианта два

- использовать доп. группу. Тогда форум сам будет проверять права при входе в соответствующий раздел на основе имеющихся групп.

- сделать доп таблицу, заносить туда пользователей которые имеют доступ к форумам. Написать хук, который при входе в определенные форумы проверяет наличие прав из нашей таблицы.

 

Я не настолько разбираюсь в php и форуме

Боюсь в любом случае вам потребуются знания php.

Как реализовать я вам сказал, а написать за вас код и копаться в классах врядли кто-то будет.

  • Автор

А дальше то, что только пользователи с этой группой смогут просматривать форум выполнив определенные действия.

 

Честно - не понимаю.

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

И как отличать в какие их пускать, а в какие нет?

Поясните пожалуйста идею.

 

Варианта два

- использовать доп. группу. Тогда форум сам будет проверять права при входе в соответствующий раздел на основе имеющихся групп.

- сделать доп таблицу, заносить туда пользователей которые имеют доступ к форумам. Написать хук, который при входе в определенные форумы проверяет наличие прав из нашей таблицы.

 

Боюсь в любом случае вам потребуются знания php.

Как реализовать я вам сказал, а написать за вас код и копаться в классах врядли кто-то будет.

К сожалению так глубоко в скрипты форума я пока не смогу залезть.

Так что если найдутся умельцы, которым будет не жалко написать - буду очень признателен.

 

Однако еще сам попробую.

 

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

Саму проверку я уже написать смогу. Но вот как ее инициировать?

Гда находится скрипт, проверяющий права доступа и как в него вставить проверку дополнительных условий?

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

Чтото вас не туда несет. Речь идет о закрытых форумах. О тех, доступ к которым нужно давать только избранным. Вот этим избранным и ставите группу, которая имеет право просматривать этот форум. Как же вы хотите реализовать, если свою задачу не можете понять до конца :)

 

Саму проверку я уже написать смогу. Но вот как ее инициировать?

Гда находится скрипт, проверяющий права доступа и как в него вставить проверку дополнительных условий?

Вот как ее инициировать эту проверку - вопрос, ответ на который уже есть решения половины задачи.

Кроме всего прочего забыли, что нужно еще проверять по таблице не только форумы но и темы, иначе любой сможет зайти по прямой ссылки в темах из "закрытых" разделов.

 

Для форумов можете посмотреть в этом файле

\admin\applications\forums\modules_public\forums\forums.php

  • Автор

Чтото вас не туда несет. Речь идет о закрытых форумах. О тех, доступ к которым нужно давать только избранным. Вот этим избранным и ставите группу, которая имеет право просматривать этот форум. Как же вы хотите реализовать, если свою задачу не можете понять до конца :)

Возможно мы не понимаем друг друга.

У меня несколько десятков закрытых форумов и несколько сотен пользователей.

Но доступ к каждому форуму нужно выдавать отдельно.

Один должен получить доступ к одному из этих десятков форумов, другой к другому.

То есть избранные для каждого форума будут свои. Так что объединить их в одну группу не получится.

 

Вот как ее инициировать эту проверку - вопрос, ответ на который уже есть решения половины задачи.

Я бы даже сказал, что это больше половины и вообще основная проблема. :)

 

Кроме всего прочего забыли, что нужно еще проверять по таблице не только форумы но и темы, иначе любой сможет зайти по прямой ссылки в темах из "закрытых" разделов.

Признаюсь, даже не думал об этом, но Вы правы.

 

Для форумов можете посмотреть в этом файле

\admin\applications\forums\modules_public\forums\forums.php

Пойду копать...

 

А для тем?

То есть избранные для каждого форума будут свои. Так что объединить их в одну группу не получится.

Создайте несколько десяток групп.

  • Автор

Создаете несколько десяток групп.

 

Ну при таком раскладе наверное выходом будет скрипт, который просто будет добавлять или убирать у пользователя в таблице дополнительные группы.

 

Вообще я уже подумал, что если по второму варианту не получится сделать - напишу скрипт, пусть лезет в таблицу пользователей форума и добавляет/убирает дополнительные группы.

С этим я справлюсь :)

 

Но все же попробую более красивый способ, если конечно найдется те, кто сможет помочь, сам я в том объеме когда форума не разберусь.

 

В любом случае готовое решение выложу тут, вдруг еще кому пригодится...

 

Подскажите, а в какой таблице форум хранит список групп?

Но все же попробую более красивый способ, если конечно найдется те, кто сможет помочь, сам я в том объеме когда форума не разберусь.

Можно не делать отдельную таблицу, а создать еще одно поле в ibf_members (скажем access_from_site), тогда не придется делать доп запрос, и все данные будут под рукой в memberData.

Присмотреться к методу forumsCheckAccess (\admin\applications\forums\sources\classes\forums\class_forums.php) - он проверят доступы, из него можно будет следить сразу и за форумами, и за топиками. Этот метод кстати можно захукать.

Создать настройку с id форумов, для которых нужно проверять доступ по нашему полю из ibf_memebrs

 

добавить в коде, ниже $fid = intval( $fid ); $deny_access = 1;

	if( ( $in == 'topic' OR $in == 'forum' ) AND in_array( $fid, explode( ',', $this->settings['access_forums_id'] ) ) )
	{
		$access_id = explode( ',', $this->memberData['access_from_site'] );
		if( ! in_array( $fid, $access_id ) )
		{
			$this->registry->output->showError('Извините, но вы не имеете доступа к этому разделу.');
		}
	}

 

$this->settings['access_forums_id'] - id форумов для инициализации проверки.

$this->memberData['access_from_site'] - id форумов к которым данный пользователи имеет доступ.

 

Ну и остается написать интерфейс для управлением пользователей с этим поле.

  • Автор

Пол ночи ломал мозг, но до конца понять не смог.

 

ниже $fid = intval( $fid ); $deny_access = 1;

если я правильно понял это 661 строка

 

Во первых как создается эта "настройка", но с другой стороны понял, что $this->settings['access_forums_id'] - это список id форумов, с которыми работает этот модуль и данные туда я вполне могу подсунуть переменной.

 

Запустить модуль получилось, он даже выдает сообщение об ошибке ,когда пользователю закрыт доступ, но вот если доступ открыт - не получается.

Выдает другое сообщение о запрете доступа (то же, что и без этого модуля).

 

Пробовал добавить else

if( ! in_array( $fid, $access_id ) ) 
                       { 
                               $this->registry->output->showError('Извините, но вы не имеете доступа к этому разделу.'); 
                       }
else
{
 $deny_access = 0;
}

Не помогло, результат тот же.

 

Или нужно следующий в коде if переделать в elseif, что бы он не выполнялся после этого кода?

 

Помогите пожалуйста разобраться.

Изменено пользователем Bard

  • Автор

Кажется разобрался.

 

Попробовал сделать elseif( $this->registry->permissions->check( 'view', $this->forum_by_id[$fid] ) == TRUE )

Но при таком режиме перестал пускать в форумы даже рутадмина, если у него не прописан доступ.

 

Так что несколько испровил блок ( $this->registry->permissions->check( 'view', $this->forum_by_id[$fid] ) == TRUE )

Для отладки вставил переменные (потом исправлю)

$bardtest=$this->settings['access_forums_id']

$bardtest2=$this->memberData['access_from_site']

Результат редактирования (насколько правильно)?

 

 

if ( $this->registry->permissions->check( 'view', $this->forum_by_id[$fid] ) == TRUE )
	{
		if ( $this->registry->permissions->check( 'read', $this->forum_by_id[$fid] ) == TRUE )
		{
			$deny_access = 0;
		}
		else
		{
			//-----------------------------------------
			// Can see topics?
			//-----------------------------------------

			if ( $this->forum_by_id[$fid]['permission_showtopic'] )
			{
				$this->read_topic_only = 1;

				if ( $in == 'forum' )
				{
					$deny_access = 0;
				}
				else
				{
					if( $return )
					{
						return false;
					}

					if( ($in=='topic' OR $in=='forum') AND in_array ($fid, explode( ',', $bardtest) ) )
					{
						$access_id=explode( ',', $bardtest2 );
						if ( ! in_array( $fid, $access_id ) )
						{
							$this->registry->output->showError('oblom');
						}
						else
						{
							$deny_access = 0;
						}
					}
					else
					{

						$this->forumsCustomError( $fid );

						$deny_access = 1;						
					}
				}	
			}
			else
			{
				if( $return )
				{
					return false;
				}

				if( ($in=='topic' OR $in=='forum') AND in_array ($fid, explode( ',', $bardtest) ) )
				{
					$access_id=explode( ',', $bardtest2 );
					if ( ! in_array( $fid, $access_id ) )
					{
						$this->registry->output->showError('oblom');
					}
					else
					{
						$deny_access = 0;
					}
				}
				else
				{

					$this->forumsCustomError( $fid );

					$deny_access = 1;
				}
			}
		}
	}
	else
	{
		if( $return )
		{
			return false;
		}

		if( ($in=='topic' OR $in=='forum') AND in_array ($fid, explode( ',', $bardtest) ) )
		{
			$access_id=explode( ',', $bardtest2 );
			if ( ! in_array( $fid, $access_id ) )
			{
				$this->registry->output->showError('oblom');
			}
			else
			{
				$deny_access = 0;
			}
		}
		else
		{
			$this->forumsCustomError( $fid );

			$deny_access = 1;
		}
	}

 

 

Проверил, вроде бы работает...

 

Теперь вопрос: где производится проверка прав на создание тем, ответы в темах, скачивание и загрузку файлов?

Во первых как создается эта "настройка"

В админцентре создается :)

 

но вот если доступ открыт - не получается.

Работайте надо логикой этого условия

if( ( $in == 'topic' OR $in == 'forum' ) AND in_array( $fid, explode( ',', $this->settings['access_forums_id'] ) )

'access_forums_id' - должна быть строка ид форумов через запятую, для которых будет проверятся наш доступ (уже в десятый раз пишу). Вы говорили что справитесь, а все равно приходится разжевывать даже простой блок if.

Результат редактирования (насколько правильно)?

Говно-код. :)

Зря вы встряли в логику, еще больше запутайтесь, работать надо было там где я вам показывал.

  • Автор

Работайте надо логикой этого условия

Понял, вставлю исключение нужных групп.

 

'access_forums_id' - должна быть строка ид форумов через запятую, для которых будет проверятся наш доступ (уже в десятый раз пишу). Вы говорили что справитесь, а все равно приходится разжевывать даже простой блок if.

Так это понятно, я так и даю ему список id форумов через запятую, к этому как раз вопросов у меня нет.

  • Автор

Благодаря Вашей наводке кажется смог решить задачу.

 

Нашел в том же файле чуть ниже обработку запароленного форума.

Ниже строчки // Do we have permission to even see the password page?

 

if ( $deny_access == 0 )
	{
		$group_exempt = 0;

		if ( isset( $this->forum_by_id[$fid]['password'] ) AND $this->forum_by_id[$fid]['password'] AND $this->forum_by_id[$fid]['sub_can_post'] )
		{
			if ( isset( $this->forum_by_id[$fid]['password_override'] ) && IPSText::cleanPermString($this->forum_by_id[$fid]['password_override']) != '' )
			{
				if ( IPSMember::isInGroup( $this->memberData, explode( ",", IPSText::cleanPermString($this->forum_by_id[$fid]['password_override']) ) ) )
				{
					$group_exempt = 1;
					$deny_access = 0;
				}
			}

			if ( $group_exempt == 0 )
			{
				if ( $this->forumsComparePassword( $fid ) == TRUE )
				{
					$deny_access = 0;
				}
				else
				{
					$deny_access = 1;

                                               if ($site_access==1)
					{
						$deny_access = 0;
					}
					else
					{
					   if ( $prompt_login == 1 )
					   {
						if( $return )
						{
							return false;
						}

						$this->forumsShowLogin( $fid );
					   }
                                               } 
				}
			}
		}
	}

$site_access - имеет значение 1 или 0, эту переменную получаю отельным скриптом, который определяет имеет ли пользователь доступ к форуму.

Таким образом полностью сохраняется функционал форума, предусмотренный разработчиками.

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.