Использование встроенной аутентификация Windows

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Konstancius
phpBB 1.2.1
Сообщения: 20
Стаж: 17 лет 9 месяцев
Поблагодарили: 9 раз

Использование встроенной аутентификация Windows

Сообщение Konstancius »

Здравствуйте, уважаемые!
Возникла такая задача:
Есть домен внутри организации, основанный на Windows. Естественно, в качестве веб сервера используется iis. В качестве конференции используется phpbb 3 версии. Проблема в том, что все пользователи хором сказали что регистрироваться они там не будут, а если и будут, то входить то точно не будут. использовать ldap нежелательно по той же причине, Пользователи готовы ввести имя/пароль 1 раз при входе в систему а больше нигде. Возникла необхомость чтобы пользователь автоматически входил на конференцию, используя его регистрационные данные windows.

В принципе, еслииспользуется связка iis + ie, то можно использовать Встроенную проверку Windows, при которой ie отсылает имя пользователя и NTLM хэш серверу iis. Достаточно считать эти данные и провести авторизацию.
Я никидал код, который вроде может проводить данную авторизцию.

Код: Выделить всё

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
require($phpbb_root_path . 'common.' . $phpEx);
require($phpbb_root_path . 'includes/functions_user.' . $phpEx);
require($phpbb_root_path . 'includes/functions_module.' . $phpEx);

$user->session_begin();
$auth->acl($user->data);
$user->setup('ucp');
function strtolower_utf8($string){ 
	$convert_to = array( 
		"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", 
		"v", "w", "x", "y", "z", "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о",
		"п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я" 
	); 
	$convert_from = array( 
		"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", 
	    "V", "W", "X", "Y", "Z", "А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О",
		"П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ъ", "Ь", "Э", "Ю", "Я" 
	); 
	return str_replace($convert_from, $convert_to, $string); 
}    
$no_autologon_users = array("админ1", "админ2");
$do_autologon = true;
$auth_user = iconv("Windows-1251", "UTF-8", $_SERVER['AUTH_USER']);
$auth_array = explode("\\", $auth_user);
$auth_domain_user = $auth_array[0];
$auth_name_user = $auth_array[1];
$def_password = "pass_".strtolower_utf8($auth_name_user);
if(in_array(strtolower_utf8($auth_name_user), $no_autologon_users))
{
	$do_autologon = false;
}
if ($user->data['is_registered']){
	$do_autologon = false;
}	
if ($do_autologon === true){
		$sql = 'SELECT user_id, username
			FROM ' . USERS_TABLE . '
			WHERE username="'.$auth_name_user.'"';		
	$result = $db->sql_query($sql);
	$us_result = "";
	$us_result = $db->sql_fetchrow($result);
	$db->sql_freeresult($result);
	if (!$us_result)
	{
		$group_name = 'REGISTERED';
		$sql = 'SELECT group_id
			FROM ' . GROUPS_TABLE . "
			WHERE group_name = '" . $db->sql_escape($group_name) . "'
				AND group_type = " . GROUP_SPECIAL;
		$result = $db->sql_query($sql);
		$row = $db->sql_fetchrow($result);
		$db->sql_freeresult($result);
	
		if (!$row)
		{
			trigger_error('NO_GROUP');
		}
		$group_id = $row['group_id'];
		$user_type = USER_NORMAL;
		$userdata = array(
			'username'			=> $auth_name_user,
			'user_password'		=> phpbb_hash($def_password),
			'user_email'		=> '',
			'group_id'			=> $group_id,
			'user_type'			=> $user_type
		);
		$curr_user_id = user_add($userdata);
	}
	$auth->login($auth_name_user, $def_password);
}
redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
После перенаправления на страницу index.php, пользователь оказывается залогинен под своим доменным именем, при этом, если он ранее входил на форум, то он регистрируется.
Уважаемые, пожалуйста, оцените данный код на корректность и порукомендуйте, каким образом лучше всего его добавить к к работающей конференции phpbb.
Аватара пользователя
Rayden
Former team member
Сообщения: 3739
Стаж: 21 год 2 месяца
Поблагодарили: 44 раза

Re: Использование встроенной аутентификация Windows

Сообщение Rayden »

Мне интересно, что выдал поиск по нашей конференции по слову "ldap" ?
phpBB2 FAQ
phpBB3 FAQ
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 17273
Стаж: 20 лет 4 месяца
Откуда: Красноярск
Благодарил (а): 633 раза
Поблагодарили: 2413 раз

Re: Использование встроенной аутентификация Windows

Сообщение rxu »

Konstancius
В целом, код выглядит более-менее нормально, не считая выборки имени из БД, которая может выдать ошибку при наличии известных символов в именах.
По поводу интеграции страницы, читайте эту тему http://www.phpbbguru.net/community/topic18700.html
Изображение
Konstancius
phpBB 1.2.1
Сообщения: 20
Стаж: 17 лет 9 месяцев
Поблагодарили: 9 раз

Re: Использование встроенной аутентификация Windows

Сообщение Konstancius »

rxu
Огромное спасибо за замечание. Думаю, здесь использую функцию user_get_id_name.
Спасибо за полезную ссылку :) Сижу изучаю.
teCa
phpBB 1.0.0
Сообщения: 4
Стаж: 18 лет

Re: Использование встроенной аутентификация Windows

Сообщение teCa »

У кого нибуть получилось реализовать?
IVoronI
phpBB 1.0.0
Сообщения: 2
Стаж: 15 лет

Re: Использование встроенной аутентификация Windows

Сообщение IVoronI »

Здравствуйте, PHP изучаю совсем недавно, знаю только азы, обработка форм, четыре команды SQL для работы с БД... Это моя первая работа, кроме меня в области веб вообще никого нет, возникла необходимость установить PHPBB. Требуется, чтобы пользователь один раз вводил логин-пароль (назовём, к примеру, avtiii – userpassw) при входе в Windows, а на форуме уже автоматически без всяких входов вместо логина были его ФИО (Иванов Иван Иванович).
Что имеется в центре администрирования в разделе аутентификация:
1) Метод аутентификации: Ldap
2) Имя сервера Ldap: srv.firm.ru:1234
3) Порт сервера Ldap: 1234
4) Основное имя Ldap: dc=firm,dc=ru
5) Идентификационный номер: sAMAccountName
6) Фильтр имени пользователя Ldap: пусто
7) E-mail-атрибут Ldap: mail
Есть ещё проблема с атрибутом емэйл: у половины народа он берётся из AD, а у половины нет.
8) Пользователь Ldap: d0s4
9) Пароль: password
Это позволяет ввести avtiii – userpassw и пользователь залогинивается, на форуме его имя везде, естественно, avtiii.

Имеется посторонний файл, который подключается к AD и выводит данные человека, который ввёл свои логин и пароль Windows. Из него, собственно, и брала данные, чтоб заполнить поля в разделе аутентификации форума.

Код: Выделить всё

$authentication = $_SERVER["AUTH_USER"];  //avtiii
$ldap_url = " srv.firm.ru:1234";
$ldap_domain = "firm.ru ";
$ldap_dn = "dc=firm,dc=ru"; 
$ds = ldap_connect( $ldap_url );
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0); 
$username = "d0s4"; 
$password = "password "; 
$login = ldap_bind( $ds, "$username@$ldap_domain", $password ); 
$attributes = array("displayname", "mail", "department", "title", "physicaldeliveryofficename", "manager");
$filter = "(&(objectCategory=person)(sAMAccountName=".$authentication."))"; 
$result = ldap_search($ds, $ldap_dn, $filter, $attributes); 
$entries = ldap_get_entries($ds, $result); 
if($entries["count"] > 0)
{
echo "<b>User Information:</b><br/>";
echo "displayName: ".$entries[0]['displayname'][0]."<br/>"; //Иванов Иван Иванович
echo "email: ".$entries[0]['mail'][0]."<br/>"; //ivanov@firm.ru 
echo "department: ".$entries[0]['department'][0]."<br/>"; //отдел, где работает Иванов
echo "title: ".$entries[0]['title'][0]."<br/>"; //должность Иванова
echo "office: ".$entries[0]['physicaldeliveryofficename'][0]."<br/>"; //местонахождение офиса Иванова
}
Хочу разобраться, но огромное количество файлов и кода пугает. Помогите, пожалуйста, подскажите, откуда копать. Я так понимаю, что рыться надо в файлах index.php или ucp.php в корневом каталоге? У автора приведённый код пишется вместо auth_ldap.php в ./includes/auth?

Версия phpbb: 3.0.9
Версия php: 5.3.6
Используемый стиль: prosilver
IVoronI
phpBB 1.0.0
Сообщения: 2
Стаж: 15 лет

Re: Использование встроенной аутентификация Windows

Сообщение IVoronI »

Пыталась сделать, как здесь описано у ssh http://www.phpbbguru.net/community/topic22274.html, в результате перестали отображаться логины типа avtiii, сразу время сообщения.

Вернуться в «Поддержка phpBB 3.0.х»