Сегодня в процессе написания очередного велосипеда мне понадобилось сделать интеграцию простого приложения на Zend Framework и Mantis Bug Tracker. Подозреваю, что со вторым продуктом знакомы не многие, но все же 🙂
Итак, что мы имеем:
— Приложение на ZF, которое находится в директории /zf-app/
— Mantis Bug Tracker (версия 1.2.11), мирно живущий в public директории zf-app
(т.е. в /zf-app/public/bug-tracker/)
Что хотим получить:
— При авторизации пользователя в приложение на ZF, пользователь должен автоматически авторизоваться на баг трекере (имена пользователей в ZF приложении и Mantis одинаковые)
Приступим к делу:
Mantis для проверки авторизации пользователей использует «магическую» строку MANTIS_STRING_COOKIE из cookies, которую сравнивает с полем «cookie_string» в таблице «user_table», поэтому для организации необходимой нам интеграции, достаточно всего лишь создать нужную куку.
Делать это мы будем с помощью простейшего класса с единственным статическим методом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
class App_Auth_Mantis { const MANTIS_PATH = '/bug-tracker/'; const MANTIS_USERS_TABLE = 'mantis_user_table'; const MANTIS_COOKIE_STRING = 'MANTIS_STRING_COOKIE'; const COOKIE_PATH = '/'; /** * @static * @param $userName * @return bool */ public static function authUser($userName) { include(PUBLIC_PATH . self::MANTIS_PATH . 'config_inc.php'); $db = new Zend_Db_Adapter_Pdo_Mysql( array( 'host' => $g_hostname, 'username' => $g_db_username, 'password' => $g_db_password, 'dbname' => $g_database_name ) ); $cookieString = $db->fetchOne( $db->select() ->from(self::MANTIS_USERS_TABLE, array('cookie_string')) ->where('username = ?', $userName) ); return setcookie( self::MANTIS_COOKIE_STRING, $cookieString, time()+60*60*24*30, // 1 месяц self::COOKIE_PATH ); } } |
Использование данного класса столь же простое:
1 2 3 4 5 |
//вставляем данный код после проверки пользователя на успешную авторизацию // $form - это форма авторизации App_Auth_Mantis::authUser($form->getValue('login')); |
Благодаря этой интеграции, Вашим пользователям не нужно будет дважды проходить процедуру авторизации.
PS: Ваши вопросы и замечания пишите в комментариях