avatar it-technology

it-technology



подробнее...

Следить за персональным блогом


Автоматизированная система Промышленная безопасность и охрана труда

Обновления главной ленты блогов
Вконтакте Facebook Twitter RSS Почта Livejournal
Внимание

На нашем портале можно бесплатно публиковать информацию о своей компании, размещать товары и услуги и цены на них.
Ведите свой личный или корпоративный блог и его ежедневно увидят 30 тысяч посетителей нашего сайта.

10 февраля 2015, 16:23

Интеграция со службами каталогов при разработке корпоративных порталов на платформе LAMP


Решаемая бизнес-задача / сфера применения


Веб-разработчики с завидной регулярностью получают заказы на создание корпоративных порталов. Под порталами в данном случае понимаются внутренние сайты предприятий, предоставляющие информацию и сервисы для собственных сотрудников и наиболее близких партнёров.

Подавляющее большинство крупных предприятий уже активно использует единую авторизацию на основе служб каталогов, доступ к которым осуществляется по Lightweight Directory Access Protocol (LDAP).

Совершенно естественно, что заказчики заинтересованы в интеграции разрабатываемого портала со службами каталогов, а разработчикам выгодно использовать внешнюю систему авторизации с точки зрения сокращения объёма работ в проекте. И хотя в ряд коробочных продуктов класса «Система управления информацией» встроена интеграция со службами каталогов, разработчикам, тем не менее, приходится решать различные технические и организационные вопросы.

Краткое описание проекта


Проект, который реализовывала наша компания в начале 2008 года, представляет собой функционально насыщенный корпоративный информационный портал холдинга, включающего в себя несколько территориально распределенных компаний. Подразделения холдинга большей частью объединены службой каталогов Microsoft Active Directory (AD).

Платформа для реализации проекта: Linux, Apache, PHP, MySQL, Cetera CMS

Основные причины использования авторизации на основе AD в данном проекте:

  • Обеспечение единого центра управления пользователями (собственно, AD) для системных администраторов компании.
  • Упрощение доступа к порталу сотрудников компании, для которых необходимость ввода лишнего пароля могла стать критической для начала использования портала.
  • Большое количество сотрудников компании (несколько тысяч человек), что делает практически невозможным ввод перечня сотрудников в БД портала и распределение персонала по дереву компаний и отделов и телефонному справочнику, реализованному в рамках портала.


Используемые технологии


Две основные задачи — импорт данных из AD и дальнейшая авторизация пользователей, просматривающих страницы портала.
Импорт данных из AD осуществляется через LDAP. LDAP позволяет получить доступ к информации домена — списку пользователей, групп, компьютеров домена и т.д.
Авторизация пользователя производится средствами Apache, а точнее его модуля mod_ntlm (доступен для версий Apache 1.3.х, для 2.2.х используется модуль mod_auth_sspi). Mod_ntlm авторизует пользователя на этапе обращения к странице, и, если пользователь проходит авторизацию, его данные (имена домена и пользователя) передаются в переменных сервера (для PHP это $_SERVER)

Описание полей AD


В рамках данного проекта требовалось получить следующую информацию о пользователе из AD:

  • полное имя (фамилия, имя, отчество)
  • доменное имя
  • email
  • должность
  • принадлежность к компании/отделу (относительно корпоративной структуры заказчика)


Имя пользователя в домене (его логин) хранится в поле SAMAccountName. Title, Department и Company описывают должность, отдел и компанию. Email хранится в поле Mail, полное имя пользователя содержится в поле Name.

Импорт сотрудников


Всякая запись в каталоге LDAP состоит из одного или нескольких атрибутов и обладает уникальным именем (DN — англ. Distinguished Name). Имя может выглядеть, например, следующим
образом:

«cn=Иван Петров, ou=Сотрудники, dc=example, dc=com».


Уникальное имя состоит из одного или нескольких относительных уникальных имен (RDN — англ. Relative Distinguished Name), разделённых запятой. Относительное уникальное имя имеет вид ИмяАтрибута=значение. На одном уровне каталога не может существовать двух записей с одинаковыми относительными уникальными именами. В силу такой структуры имени записи в каталоге LDAP можно легко представить в виде дерева.
Для выполнения поиска по структуре службы каталога требуется указать путь к корневому элементу, относительно которого будет осуществлен поиск. Также можно указать фильтр, состоящий из перечисления имен атрибутов записи и их значений в формате ИмяАтрибута=Значение.
Предположим, что требуется осуществить импорт сотрудников домена COMPANY.RU. Для этого путь поиска будет, например, такой:

cn=Users, dc=COMPANY, dc=RU


cn=Users указывает на т.н. контейнер под название Users.
При выполнении такого поиска без дополнительной фильтрации в результатах могут присутствовать другие элементы помимо самих пользователей. Например, данные о группах. Для получения в результатах поиска лишь данных о пользователях укажем фильтр:

ObjectCategory=Person.


В некоторых случаях пользователи в AD могут размещаться в т.н. Organizational Units. В таком случае используем путь поиска:

ou=Users-and-computers, dc=COMPANY, dc=RU.


Такой путь подразумевает, что данные об учетных записях находятся в Organizational Unit под названием Users-and-computers.
В процессе импорта может возникнуть потребность определения активности учетной записи пользователя. При импорте может быть интересен атрибут учетной записи UserAccountControl, в котором сохраняются в двоичном виде различные свойства учетной записи. Интересным может быть признак ACCOUNTDISABLE (0x0002). Если данный флаг установлен в атрибуте UserAccountControl, учетная запись считается заблокированной.
Для поиска всех активных пользователей потребуется модифицировать фильтр. Он будет таким:

(&(objectcategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.804:=2)))


1.2.840.113556.1.4.804 — т.н. OID (Object IDentifier), данный OID применяется для отбора объектов, выбранный атрибут которых содержит либо все, либо любой из указанных в фильтре битов. Приведенный выше OID признает совпадение, если в атрибуте присутствует любой из указанных битов. 2 — это значение флага ACCOUNTDISABLE. Данный фильтр целиком можно расшифровать так: Атрибут objectcategory равен Person и в атрибуте UserAccountControl не присутствует бит 2 (0x0002)

Пример кода на PHP
<?
/**
* Данный код подключается к AD и получает список всех незаблокированных сотрудников
* контейнера Users из домена СOMPANY.RU
* Выводится имя сотрудника, его email, компания, отдел и должность в соответствии с данными,
* полученными из AD
*/
$ds=ldap_connect("1.2.3.4");
if ($ds) {
$r=ldap_bind($ds,'COMPANYadmin','adminPassword');
$sr=ldap_search($ds,
"cn=Users, dc=COMPANY, dc=RU",
'(&(objectcategory=Person)(!(UserAccountControl:1.2.840.113556.1.4.804:=2)))');

echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "
";

$info = ldap_get_entries($ds, $sr);
// $info содержит результаты запроса...

for ($i=0; $i<$info["count"]; $i++) {
echo "Name: {$info[$i]['name'][0]}
n";
echo "Email: {$info[$i]['mail'][0]}
n";
echo "Company: {$info[$i]['company'][0]}
n";
echo "Department: {$info[$i]['department'][0]}
n";
echo "Title: {$info[$i]['title'][0]}
n";
}

ldap_close($ds);

} else {
echo "Unable to connect to LDAP server";
}
?>

Дополнительная информация по работе с LDAP в PHP может быть получена в документации

Проблемы и решения


Отсутствие в службе каталогов информации о сотрудниках, достаточной для отображения на портале (полные имена, адреса Email, названия подразделений, хобби, поля корпоративной социальной сети и т.д.).


Почти всегда в службе каталогов не содержится вся информация, необходимая для работы портала. Могут отсутствовать как «банальные» данные, например, номер телефона, так и нетипичные для службы каталогов сведения типа «перечень мест предыдущей работы для нужд корпоративной социальной сети». При этом необходимость этих данных для портала сложно недооценивать.

Нашим решением проблемы является хранение учётных записей в службе каталогов, а расширенной информации — в открытой БД портала. Предполагается, что управление списком и ролями пользователей осуществляется в службе каталогов, а всё остальное — задачи портала.

Недостатком решения является необходимость связывания и синхронизации перечней пользователей в службе каталогов и в БД портала.

Важнейшие преимущества:

  • предоставление пользователям возможности самостоятельно дополнять информацию о себе в БД портала с последующей модерируемой загрузкой этих сведений в службу каталогов;
  • возможность быстро настраивать набор полей в профиле пользователя портала без влияния на работу службы каталогов.


Отсутствие в службе каталогов достоверной информации о принадлежности сотрудника к той или иной компании холдинга или отделу


Стандартом де-факто для корпоративных порталов является отображение дерева компаний холдинга и отделов с автоматической привязкой к дереву сотрудников. При этом часто в службе каталогов сотрудники хранятся единым плоским списком с указанием компаний и отделов в каких-либо свойствах пользователей службы каталогов.

Наше решение:

  1. Завести дерево компаний и отделов на портале средствами системы управления контентом, используя данные об организационной структуре, предоставленные заказчиком.
  2. Импортировать сотрудников из службы каталогов со сверкой названий элементов дерева, заведенного в БД портала, с содержимым карточек пользователей службы каталогов.
  3. Пользователей, для которых определить положение в дереве не удалось, импортировать во временную директорию.
  4. По итогам импорта отображать протокол с нотификацией администраторов портала и службы каталогов о недостатках импорта и некачественных записях в службе каталогов.

Источник: http://geektimes.ru/post/30182/


Журнал приложения
Время Уровень Категория Сообщение
15:43:46.797310 trace system.CModule
Loading "log" application component
15:43:46.797461 trace system.CModule
Loading "request" application component
15:43:46.797533 trace system.CModule
Loading "urlManager" application component
15:43:46.797616 trace system.CModule
Loading "cache" application component
15:43:46.798367 trace system.db.ar.CActiveRecord
Redirects.findByAttributes()
15:43:46.798376 trace system.CModule
Loading "db" application component
15:43:46.798422 trace system.db.CDbConnection
Opening DB connection
15:43:46.799130 trace system.db.CDbCommand
Querying SQL: SELECT * FROM `ai_redirects` `t` WHERE `t`.`from`=:yp0 LIMIT
1
15:43:46.799695 trace system.db.ar.CActiveRecord
Tags.findAll()
15:43:46.799926 trace system.db.CDbCommand
Querying SQL: SELECT id FROM `ai_tags` `t` WHERE name IN (:ycp0, :ycp1,
:ycp2, :ycp3, :ycp4, :ycp5, :ycp6, :ycp7, :ycp8, :ycp9)
15:43:46.800124 trace system.db.ar.CActiveRecord
ArticlesTags.findAll()
15:43:46.800870 trace system.db.CDbCommand
Querying SQL: SELECT `t`.`id` AS `t0_c0`, `t`.`article` AS `t0_c1`,
`t`.`tag` AS `t0_c2`, `articles_data`.`id` AS `t1_c0`,
`articles_data`.`type` AS `t1_c1`, `articles_data`.`link` AS `t1_c2`,
`articles_data`.`title` AS `t1_c3`, `articles_data`.`description` AS
`t1_c4`, `articles_data`.`content` AS `t1_c5`,
`articles_data`.`source_content` AS `t1_c6`, `articles_data`.`source_url`
AS `t1_c7`, `articles_data`.`updated` AS `t1_c8`, `articles_data`.`created`
AS `t1_c9`, `articles_data`.`lang` AS `t1_c10`, `articles_data`.`preview`
AS `t1_c11`, `articles_data`.`has_filtered` AS `t1_c12`,
`articles_data`.`broken_images` AS `t1_c13`, `articles_data`.`has_tags` AS
`t1_c14`, `tag_data`.`id` AS `t2_c0`, `tag_data`.`name` AS `t2_c1`,
`tag_data`.`link` AS `t2_c2`, `tag_data`.`type` AS `t2_c3`,
`tag_data`.`disabled` AS `t2_c4` FROM `ai_articles_tags` `t`  LEFT OUTER
JOIN `ai_articles` `articles_data` ON (`t`.`article`=`articles_data`.`id`) 
LEFT OUTER JOIN `ai_tags` `tag_data` ON (`t`.`tag`=`tag_data`.`id`)  WHERE
(((t.tag IN (:ycp10, :ycp11)) AND (articles_data.lang=:ycp12)) AND
(articles_data.type=:ycp13)) AND (tag_data.disabled = 0) GROUP BY
articles_data.id ORDER BY field(tag_data.type, 'product', 'brand', 'os',
'word'), articles_data.created desc LIMIT 10
15:43:46.855918 trace system.caching.CMemCache
Saving
"yii:dbquerymysql:host=localhost;dbname=analogindex:analogindex:SELECT
`t`.`id` AS `t0_c0`, `t`.`article` AS `t0_c1`, `t`.`tag` AS `t0_c2`,
`articles_data`.`id` AS `t1_c0`, `articles_data`.`type` AS `t1_c1`,
`articles_data`.`link` AS `t1_c2`, `articles_data`.`title` AS `t1_c3`,
`articles_data`.`description` AS `t1_c4`, `articles_data`.`content` AS
`t1_c5`, `articles_data`.`source_content` AS `t1_c6`,
`articles_data`.`source_url` AS `t1_c7`, `articles_data`.`updated` AS
`t1_c8`, `articles_data`.`created` AS `t1_c9`, `articles_data`.`lang` AS
`t1_c10`, `articles_data`.`preview` AS `t1_c11`,
`articles_data`.`has_filtered` AS `t1_c12`, `articles_data`.`broken_images`
AS `t1_c13`, `articles_data`.`has_tags` AS `t1_c14`, `tag_data`.`id` AS
`t2_c0`, `tag_data`.`name` AS `t2_c1`, `tag_data`.`link` AS `t2_c2`,
`tag_data`.`type` AS `t2_c3`, `tag_data`.`disabled` AS `t2_c4` FROM
`ai_articles_tags` `t`  LEFT OUTER JOIN `ai_articles` `articles_data` ON
(`t`.`article`=`articles_data`.`id`)  LEFT OUTER JOIN `ai_tags` `tag_data`
ON (`t`.`tag`=`tag_data`.`id`)  WHERE (((t.tag IN (:ycp10, :ycp11)) AND
(articles_data.lang=:ycp12)) AND (articles_data.type=:ycp13)) AND
(tag_data.disabled = 0) GROUP BY articles_data.id ORDER BY
field(tag_data.type, 'product', 'brand', 'os', 'word'),
articles_data.created desc LIMIT
10:a:4:{s:6:":ycp10";s:3:"159";s:6:":ycp11";s:5:"19650";s:6:":ycp12";s:2:"ru";s:6:":ycp13";s:7:"opinion";}"
to cache

Инструкции по теме

29 января 2015 г., 22:57:22

В качестве десктопа у меня iMac с Leopard'ом. По умолчанию в комплекте с Леопардом идет апач и PHP с расширением для работы с MySQL. А разрабатываю я приложения, которые подключаются к базам данных MySQL, MsSQL и Oracle. Поэтому «родного» PHP мне не хватает. Помимо этого, мне необходим proxy_http_module...

29 октября 2014 г., 16:13:31 I am Groot. Делаем свою аналитику на событиях

Весной этого года я узнал о возможности базы данных HP Vertica создавать запросы с матчингом паттернов событий. Так называемый Events Pattern Matching хорошо ложился под задачу анализировать поведение пользователей в продуктах ivi.ru. Мы решили попробовать разобраться с воронками оплаты, с поиском проблемных...

28 июня 2014 г., 15:10:05

В рунете да и в целом в интернете мало рассказывается о таком интересном продукте, как openchange. В теории openchange и его сопутствующие компоненты должны полностью заменять MS Exchange Server, на практике же это получается не совсем. Тех кто заинтересовался прошу в сам пост. Там будет рассказано о...

12 июня 2014 г., 15:11:04 image

Введение Как известно, на многих сайтах/веб-приложениях необходимо тем или иным образом реализовать поиск. Все хотят быстрый и качественный поиск. Разработчики помимо всего прочего хотят, чтобы поисковик был прост в установке и использовании. Так как речь идет о django, то перед нами встает ряд ограничений...

1 марта 2014 г., 15:11:38 image

В первой части мы установили MySQL и собрали Астериск из исходников с поддержкой res_config_mysql (Asterisk Realtime Architecture) Настройка DHCP-сервера У меня в двух рабочих средах развёрнуты разные DHCP-серверы, покажу настройки для трёх самых (имхо) популярных: Windows Server DHCP, Mikrotik, DNSMasq Windows...

19 января 2014 г., 0:10:50 image

Netavis Observer — программный продукт для организации видеонаблюдения с помощью IP-камер на базе Linux-сервера. Netavis Observer написан на Java, так же используются такие продукты как Apache Tomcat, Webmin, Munin, Mysql. Существует два варианта Netavis Observer — Bundled(поставляется в виде...

13 ноября 2013 г., 6:11:27 image

Мобильные приложения, это не будущее разработки, это уже настоящее. В настоящее время пользователей мобильных приложений уже 1.2 млрд. человек, и это количество постоянно растет (Wikipedia). Вскоре количество мобильных устройств превзойдет количество людей на планете. Если скорость роста количества мобильных...

30 апреля 2013 г., 18:06:06 image

Компания Google опубликовала исходный код Google Glass. Напомню, что система базируется на Android 4.0.4 (а если быть точным, на этой версии базируется прототип, высланный в рамках Explorer Edition). Следует отметить, что опубликован не весь исходный код, т.к. часть его идет под лицензией GPL v2 (и,...

26 декабря 2012 г., 16:57:12 [recovery mode] Офлайн-информер для онлайн-бизнеса

Наверное каждый кто кто развивает свой онлайн-бизнес постоянно отслеживает текущее положение дел, для этого вы собираете статистики, и выводите графики, но лично у меня всегда было ощущение виртуальности происходящего, кто-то зашел на сайт, зарегистрировался и даже совершил покупку. Всё это хорошо...

20 ноября 2012 г., 18:48:24

Добрый день! В статье я расскажу, как мы работаем с svn через git и почему не выбрали чистый git. SVN Subversion — это централизованная система контроля версий. Это главный ее минус и главный ее плюс :) Плюс в том, что централизация дает возможность, например, нумеровать коммиты, т.к. их порядок...


Обзоры по теме

26 января 2015 г., 4:10:51

Представляю вашему вниманию очередной выпуск обзора наиболее интересных материалов, посвященных теме анализа данных и машинного обучения. Общее   Визуализация многомерных данных с помощью диаграмм Эндрюса   Microsoft покупает компанию Revolution Analytics  Лучшие презентации SlideShare по теме...

15 декабря 2014 г., 8:06:17 HABR

Представляю вашему вниманию очередной выпуск обзора наиболее интересных материалов, посвященных теме анализа данных и машинного обучения. Общее   Яндекс открывает новое направление своей деятельности — Yandex Data Factory   Как мы делали полярный график в DevExtreme  Зарплата и инструменты...

28 ноября 2014 г., 14:58:18 фото MSI GE60 2PE Apache Pro

Сейчас же перед нами ещё один 15-дюймовый игровой лэптоп от MSI GE60 2PE Apache Pro, что оказался красивее и уже, чем его «главные» предшественники: толщина ноутбука сейчас образовывает 37,6 мм, тогда как у «Доминатора» с 15-дюймовым экраном она достигала 58 мм. Крышка ноутбука так же, как и прежде сделана...

18 октября 2014 г., 16:10:30

EclipseLink — это ORM фрэймворк с открытым исходным кодом, разрабатываемый Eclipse Foundation. В конце года запланирован выход версии 2.6.0. проекта. В преддверии этого, я хочу ознакомить вас с некоторыми новыми возможностями службы JPA-RS, которая является частью EclipseLink. JPA-RS позволяет автоматически...

12 октября 2014 г., 8:07:47

Пару недель назад в Калуге прошла конференция OSSDEVCONF-2014, или более солидно «Одиннадцатая конференция разработчиков свободных программ». Тематика в целом — «как внедрять СПО», «перспективы импортозамещения», «СПО во всех видах — от госпорталов до CAD-систем и Instant Messengerов», тонкости разработки...

19 августа 2014 г., 0:11:18 Обзор наиболее интересных материалов по анализу данных и машинному обучению №9 (11 — 18 августа 2014)

Представляю вашему вниманию очередной выпуск обзора наиболее интересных материалов, посвященных теме анализа данных и машинного обучения. В данном выпуске достаточно много интересных видеоматериалов. Некоторые количество материалов посвящено теме Data Engineering. В данном выпуске достаточно много практических...

13 июля 2014 г., 0:11:06 Обзор 7 самых популярных кроссплатформенных мобильных фреймворков

На работе меня попросили сделать сравнительную характеристику нескольких продуктов для создания кроссплатформенных мобильных приложений: Appcelerator Titanium, Kony Platform, Adobe PhoneGap, IBM Worklight, Telerik Platform, Verivo Akula, Xamarin. Потратил немало времени, поэтому решил, что лучше поделиться...

9 июля 2014 г., 0:11:43 Обзор Komodo Edit и Komodo IDE 8

Привет. На хабре много обзоров различных сред разработки, но совсем мало информации про Komodo Edit и Komodo IDE. Я пользуюсь Komodo с 2010 года и за это время вышло несколько мажорных релизов и хочу с вами поделиться кратким обзором основных возможностей. Komodo Edit — это кросс-платформенный текстовый...

26 июля 2013 г., 12:06:31

Сегодня вышла предварительная версия Internet Explorer 11 для Windows 7. Ранее он был доступен только пользователям Windows 8.1. Новый браузер обеспечит высокую производительность, большую скорость загрузки страниц, и поддержку последних стандартов,...

5 мая 2013 г., 7:06:17

После более чем двух лет разработки увидел свет релиз Debian GNU/Linux 7.0 (Wheezy), доступный для 13 официально поддерживаемых архитектур, среди которых: Intel IA-32 (i386), 64-bit PC / Intel EM64T / x86-64 (amd64), Motorola/IBM PowerPC (powerpc), Sun/Oracle SPARC (sparc), MIPS (mips и mipsel), Intel...