Рассмотрим такую несложную задачу администрирования как вход под именем другого пользователя в drupal.
Иногда требуется взглянуть на сайт «глазами» конкретного пользователя. Но нам как администратору сайта не хотелось бы узнавать пароль пользователя, а также прибегать к разного рода техникам «взлома» (вроде подмены хеша пароля в базе данных, пусть даже на время).
Чтобы сделать все «красиво», добавим в какой то свой модуль пару хуков и код странички с формой авторизации. В результате, мы сможем выдавать право авторизации под любой учеткой для какой то из ролей сайта.
Я свой модуль обозвал как «shra_contribution», потому мой код выглядит так:
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 40 41 42 43 44 |
function shra_contribution_menu() { //вход под другим юзером добавим в админ меню $items['admin/user/login-as'] = array( 'title' => 'Войти как...', 'page callback' => '_shra_contribution_login', //право доступа есть только у ролей с вот таким разрешением 'access arguments' => array('login as'), 'type' => MENU_NORMAL_ITEM, ); } //хук для объявления разрешения function shra_contribution_perm() { return array('login as'); } /* реализация странички войти как ... */ function _shra_contribution_login() { global $user; //обработка данных формы if (!empty($_POST['sbm']) && !empty($_POST['login'])) { //определим USER ID по имени $uid = db_result(db_query("SELECT uid FROM users WHERE name = '%s'", trim($_POST['login']))); if ($uid) { //авторизация $account = user_load(array('uid' => $uid)); $user = $account; sess_regenerate(); $edit = $_POST; user_module_invoke('login', $edit, $user); //идем на главную страницу drupal_goto('<front>'); } } //форма авторизации - тут всего одно поле: /имя пользователя return ' <form method="POST"> Имя пользователя: <input type="text" name="login" value="" /> <input type="submit" name="sbm" value="Войти" /> </form>'; } |
Сама авторизация, как вы видите, занимает не более 10 строк. Код актуален для 6-й версии drupal. А форма авторизации выглядит так:
Интересное решение. А если подобный хук для D7?