Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как можно получить логин пользователя
 
 автор: rene   (11.12.2006 в 17:21)   письмо автору
 
 

Здравствуйте all.
Мне необходимо получить имя (login) пользователя, который он ввел во время NTML аутоидентификации windows. Каким образом это можно сделать?

З.Ы. Поскольку я еще совсем зеленый, просьба меня сильно не пинать :)

   
 
 автор: Fli   (11.12.2006 в 17:26)   письмо автору
 
   для: rene   (11.12.2006 в 17:21)
 

Аммм... так что ли?


<?php

if (!empty ($_POST['User'])) {
     echo 
htmlspecialchars ($_POST['User']);
}

?>

<html>
<form method = "POST">
<input type = "text" name = "User">
<input type = "submit">
</form>

   
 
 автор: rene   (11.12.2006 в 18:20)   письмо автору
 
   для: Fli   (11.12.2006 в 17:26)
 

Хм... нет!
Мне бы хотелось получить имя пользователя, под которым он вошел в систему (windows).
Это используется при windows авторизации на прокси сервере.

   
 
 автор: aexb   (11.12.2006 в 19:28)   письмо автору
 
   для: rene   (11.12.2006 в 18:20)
 

Очень долго бились над этим всей большой командой. На PHP (при работе с сервером) не получается, хоть тресни. Нам это нужно было для интранета - проще, чем делать систему авторизации. Никак. Причем в той части интранета, которая сделана шведами на ASP - каким-то образом юзернэйм вылавливается и все в порядке.

Кстати, дома на локальной машине (стоит денвер) работают переменные $_ENV['USERNAME'] и $_ENV['USERPROFILE']. Только что проверил. На сервере - нет. Может, сервер надо как-то настраивать?

   
 
 автор: rene   (12.12.2006 в 21:10)   письмо автору
 
   для: aexb   (11.12.2006 в 19:28)
 

Вот код, выводящий имя пользователя, домен и имя машины. Отыскал в дебрях инета.
Переменные тут интересные, например переменной $login было присвоено значение "rene", но функция strlen ($login) утверждает что в ней 8 символов :) т.е. между буквами вставлены символы с кодом 0. Я чуть голову не сломал пытаясь работать с этой переменной, слабоват я еще для PHP :)


<?php
$headers 
apache_request_headers();     // получаем все заголовки клиента
if (!isset($headers['Authorization'])) { // если заголовка авторизации нет
  
header('HTTP/1.0 401 Unauthorized');   // требуем от клиента авторизации
  
header('WWW-Authenticate: NTLM');      // тип требуемой авторизации - NTLM
  
exit;                                  // завершаем выполнение скрипта
}
if(isset(
$headers['Authorization']))                //dans le cas d'une authorisation (identification)
{
    if(
substr($headers['Authorization'],0,5) == 'NTLM '){   // on verifit que le client soit en NTLM


        
$chaine=$headers['Authorization'];
        
$chaine=substr($chaine5);             // recuperation du base64-encoded type1 message
        
$chained64=base64_decode($chaine);      // decodage base64 dans $chained64

        
if(ord($chained64{8}) == 1){
        
//          |_ byte signifiant l'etape du processus d'identification (etape 3)

        // verification du drapeau NTLM "0xb2" a l'offset 13 dans le message type-1-message :
        
if (ord($chained64[13]) != 178){
        echo 
"Ваш браузер не потдерживает NTLM авторизацию бла бла бла";
        exit;
        }
            
$retAuth "NTLMSSP";
            
$retAuth .= chr(0);
            
$retAuth .= chr(2);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(40);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(1);
            
$retAuth .= chr(130);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(2);
            
$retAuth .= chr(2);
            
$retAuth .= chr(2);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);
            
$retAuth .= chr(0);

            
$retAuth64 =base64_encode($retAuth);        // encode en base64
            
$retAuth64 trim($retAuth64);          // enleve les espaces de debut et de fin
            
header"HTTP/1.0 401 Unauthorized" );      // envoi le nouveau header
            
header"WWW-Authenticate: NTLM $retAuth64);  // avec l'identification supplementaire
            
exit;

        }

        else if(
ord($chained64{8}) == 3){
        
//               |_ byte signifiant l'etape du processus d'identification (etape 5)

        // on recupere le domaine

        
$lenght_domain = (ord($chained64[31])*256 ord($chained64[30])); // longueur du domain
        
$offset_domain = (ord($chained64[33])*256 ord($chained64[32])); // position du domain.
        
$domain substr($chained64$offset_domain$lenght_domain); // decoupage du du domain

        //le login
        
$lenght_login = (ord($chained64[39])*256 ord($chained64[38])); // longueur du login.
        
$offset_login = (ord($chained64[41])*256 ord($chained64[40])); // position du login.
        
$login substr($chained64$offset_login$lenght_login); // decoupage du login

        // l'host
        
$lenght_host = (ord($chained64[47])*256 ord($chained64[46])); // longueur de l'host.
        
$offset_host = (ord($chained64[49])*256 ord($chained64[48])); // position de l'host.
        
$host substr($chained64$offset_host$lenght_host); // decoupage du l'host



        
echo "Domain is  : $domain";
        echo 
"<br>Login is : $login";
        echo 
"<br>host is  : $host";
        }

    }

}
?>

   
 
 автор: rene   (13.12.2006 в 07:46)   письмо автору
 
   для: aexb   (11.12.2006 в 19:28)
 

>Кстати, дома на локальной машине (стоит денвер) работают переменные $_ENV['USERNAME'] и $_ENV['USERPROFILE']. Только что проверил. На сервере - нет. Может, сервер надо как-то настраивать?

По поводу переменной окружения $_ENV. ИХМО в нее передаются различные значения из окружения в которой работает PHP, в частности из операционной системы. Я так понимаю, для разных платформ и операционок и значения будут разные, к примеру для *nix систем переменная $_ENV['USERPROFILE'] может осутствовать.

для примера:

<?php
foreach ($_ENVas $ var => $value)
{
echo 
"$var$value <br>";
}
?>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования