На моей основной работе у меня стоит задача, сделать ограниченный доступ к страничкам ресурса (поднял я его на С5) учитывая, что если юзверь в домене - доступ есть, если не в домене, выскакивает окно залогинивания, ну а дальше просмотр согласно прав в AD. Сервер nix-овый (CentOS), на нем стоит Apache, MySQL, PHP, ну в общем все, что нужно.
Как я вижу, для решения этой задачи необходимо:
1. определить имя юзверя компа, с которого происходит вход на страничку.
2. проверить это имя на принадлежность к тому или иному домену, принадлежность к группе и его права.
3. дать доступ согласно прав.
В результате долгих поисков, я так и не нашел другого способа, как это сделать из браузера, кроме как в IE с помощью ActiveX. Если есть такой способ, подскажите.
Что я сделал:
Первый вопрос - определяем юзверя -
- Код: Выделить всё
<script language="JScript">
var wshshell=new ActiveXObject("wscript.shell");
var username=wshshell.ExpandEnvironmentStrings("%username%");
alert (username);
</script>
При этом необходимо браузеру дать разрешение работать с ActiveX-компонентами по полной. Т.к. это интранет, то разрешения по идее может поставить администратор домена и не придется бегать к каждому компу и настраивать его.
Замечу, что на локальной машине работает любой код для создания объекта ActiveX, который есть в сети, например:
- Код: Выделить всё
<script language="JScript">
var WshNetwork = new ActiveXObject("WScript.Network");
alert (WshNetwork.UserName);
</script>
однако стоило мне залить эту страничку на сервак, как код переставал работать не смотря на полное разрешение ActiveX компонентов.
Итак, первый вопрос я решил.
Второй вопрос
Чтобы его решить, нам нужно уметь читать AD с помощью php. Для этого необходимо для начала установить на сервер расширение php-ldap, а далее пишем вот такой код прямо в body:
- Код: Выделить всё
<?
// здесь находятся используемые переменные
$srv = "10.5.48.57";
$srv_domain = "anydomain.vasya.com";
$srv_login = "user@".$srv_domain;
$srv_password = "password";
$dn = "dc=anydomain,dc=vasya,dc=com";
//фильтр, по которому мы будем цеплять данные из AD, mail=* - означает, что это поле не должно быть пустым, можно задать шаблон (мало-ли кто, что пишет в это поле)
$filter = "(&(mail=*)(objectCategory=user))";
$attr = array("cn","mail","title","department","company","homephone");//описаны атрибуты ldap
//соединяемся с AD
$dc = ldap_connect($srv);
ldap_set_option($dc, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($dc, LDAP_OPT_REFERRALS,0);
//выводим данные
if($dc){
ldap_bind($dc,$srv_login,$srv_password);
$result = ldap_search($dc, $dn, $filter, $attr);
$result_entries = ldap_get_entries($dc, $result);
ldap_unbind($dc);
}
?>
<table width="100%" border="1">
<? for($i=0;$i<$result_entries['count'];$i++) { ?>
<tr>
<td><?=$result_entries[$i]['cn'][0]?></td>
<td><?=$result_entries[$i]['mail'][0]?></td>
<td><?=$result_entries[$i]['title'][0]?></td>
<td><?=$result_entries[$i]['department'][0]?></td>
<td><?=$result_entries[$i]['company'][0]?></td>
<td><?=$result_entries[$i]['homephone'][0]?></td>
</tr>
<? } ?>
</table>
Атрибуты ldap можно посмотреть
Пожалуйста зарегистрируйтесь, чтобы увидеть ссылку
Итак, имя пользователя мы получаем, читать из AD умеем, теперь дело за малым, написать скрипт, который будет пробегать по записям в AD и сравнивать имя пользователя, предоставляя затем ему те или иные права на просмотр страниц. Повторюсь, все это я хочу реализовать на С5 =) Вот над скриптом я пока работаю, так что, если интересно, спрашивайте, но продолжение в любом случае напишу. Если есть какие-нибудь мысли, советуйте, буду рад.