Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

Моя версия 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, эту переменную получаю отельным скриптом, который определяет имеет ли пользователь доступ к форуму.

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

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

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.