Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
Bard

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

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

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

 

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

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
02/26/12 08:25 (изменено)

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

 

ниже $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 форумов через запятую, к этому как раз вопросов у меня нет.

Поделиться сообщением


Ссылка на сообщение

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

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

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

×
×
  • Создать...