Pull to refresh

Codeigniter и LDAP авторизация в Active Directory

image

Статья ориентирована на начинающих Codeigniter-щиков, таких как я.



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



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



Допустим, что CI уже установлен и настроен. Кстати, на одном из западных сайтов, доступно 16 очень хороших и исчерпывающих видео уроков по настройке и использованию Codeigniter-а.



Добавим библиотеку и конфигурационный файл


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



Первым делом создадим конфигурационный файл, например adldap.php и положим его в \system\application\config\



<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$config['account_suffix'] = '@dom.ru';
$config['base_dn'] = 'DC=dom,DC=ru';
$config['domain_controllers'] = array ("DC01.dom.ru");
$config['ad_username'] = 'web_user';
$config['ad_password'] = 'web_passS8';
$config['real_primarygroup'] = true;
$config['use_ssl'] = false;
$config['use_tls'] = false;
$config['recursive_groups'] = true;


Далее необходимо добавить библиотеку. Но как сделать так, что бы ей можно было пользоваться в CI, как остальными? За нас это уже сделал один программист, и предоставил для общественного пользования (он утверждает, что лицензия не нарушена). Ее мы и добавим в \system\libraries\ и назовем, например Adldap.php.



После выше описанных манипуляций библиотекой можно пользоваться в Codeigniter-е, как и другими, например:



$this->load->library('Adldap');
$this->adldap->authenticate($username, $password);


Напишем небольшой код авторизации


Сделать это проще простого.
Во-первых, создадим форму для ввода логина и пароля:



// "_" конечно надо убрать
<form_ action="http://info.dom.ru/login/gateway" method="post">
<input_ name="username" type="text" value="Логин">
<input_ name="password" type="password" value="Пароль">
<input_ type="submit" name="submit" value="Войти" >
</form_>


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



Для более тонкой настройки нужен еще один параметр — группа (Active Directory). Назовем ее, например Web_Group, и добавим нужных нам пользователей.



Примерный код авторизации:



<?php

//Создаем контроллер
class login extends Controller {

//Функция для проверки логина, пароля и группы
function gateway() {

//Подключаем библиотеку
$this->load->library('Adldap');

//Проверяем логин и пароль
$authUser = $this->adldap->authenticate($this->input->post('username'), $this->input->post('password'));

//проверяем наличие пользователя в группе
$groupinfo = $this->adldap->user_ingroup($this->input->post('username'), 'Web_Group', 'NULL');

//В случае если $authUser и $groupinfo истина
if ($authUser === true and $groupinfo === true) {

//добавляем информацию в массив сессии о том, что проверка успешна и доступ к определенным ресурсам открыт
$data = array('username' => $this->input->post('username'), 'usergroup_access' => 'Web_Group', 'is_logged_in' => true);
$this->session->set_userdata($data);

redirect();
} else {
echo "Ошибка авторизаци";
}
}
}


Вот и все. Теперь в любой другой функции можно делать проверку и в зависимости от результата предоставлять или не предоставлять доступ.
Примерно должно выглядеть так:



function view_data() {

//Из массива сессии вытаскиваем и проверяем прошел или нет пользователь авторизацию
if ($this->session->userdata('is_logged_in') == true) {
echo "Доступ к данным открыт";
} else {
echo "Доступ закрыт";
}
}


Теперь осталось только дописать функцию уничтожения сессии (Logout):



function logout() {
$this->session->sess_destroy();
redirect();
}


Спасибо за внимание.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.