Поддержка Проблемы и решения Запрет доступа к админке

  • Доброго времени суток, уважаемые.

    Вопрос банален, но хочу получить исчерпывающие ответы и сделать «по-нормальному»

    1) Что хочу — запретить доступ не админам (user_level == 0) к админской части ВП и редиректить их на главную.

    2) Что для этого делаю — использовал все варианты, которые нашел в интернете. Остановился на этих двух (добавляю в functions.php темы).

    Первый :

    if (is_user_logged_in() && !defined('DOING_AJAX') && is_admin()) {
        global $current_user;
        get_currentuserinfo();
        $user_info = get_userdata($current_user->ID);
        if ($user_info->user_level == 0) {
            show_admin_bar(false);
            wp_redirect(get_bloginfo('home'), 301);
        }
    }

    Второй :

    function users_redirect() {
        wp_redirect(site_url());
        die();
    }
    
    if (!current_user_can('manage_options')) {
        add_action('admin_init', 'users_redirect');
    }

    3) В чем проблема — при попытке доступа к «/wp-admin» сайта не-админами получаю «You do not have sufficient permissions to access this page.» и в консоли Firebug 500 ошибку. Естественно без редиректа на главную. Вроде-бы и все правильно, в админку не пустило, но нету редиректа и 500 ошибка. Негоже, короче…

    Как сделать правильно? Как не-админов редиректить на главную?

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Проблема, оказывается, не там, где я копал…

    На данный момент закомментировал весь код, который ограничивает доступ к админке. При попытке доступа не-админом к wp-admin (или после логина не-админа) получаю ответ:

    You do not have sufficient permissions to access this page.

    и Фаербаг в консоль пишет 500 ошибку. Путем гугления было установлено, что ошибку генерирует сам ВП после проверки прав пользователя и отображения страницы (нативные 500 ошибки сервера не так выглядят).

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

    wp_insert_user()

    но при этом параметр role оставил пустым, понадеявшись, что ВП подставит дефолтное значение — итого имею около 140 пользователей, с которыми ВП не знает как работать, потому что им не присвоен role.

    Сейчас попробую удалить всех пользователей и зарегистрировать их заново уже с нормальными данными.

    Если я копаю не в ту сторону — лучше остановите меня сейчас, пока я не влез в дебри 🙂

    Запретить всем входить, кроме админа, но оставить доступными скрипты, стили и тп?
    или
    Редиректить на главную после логина, но не запрещено входить после?

    1)В админку нельзя никому входить, кроме админа(админов).
    2)Все скрипты должны работать (аякс и прочее)
    3)Также нужно не-админов при обращении к /wp-admin редиректить на главную. Им даже профиль свой смотреть нельзя.

    Вот решение, но у меня оно не работает, потому что я неправильно зарегистрировал пользователей — я им не присвоил параметр role. Сам ВП тоже не присвоил значение по умолчанию. Когда смотришь в админской части пользователей, то ихняя роль отображается как None, и БД там тоже пусто. Думаю, что проблема в этом…

    Думаю, что проблема в этом…

    Возможно.
    http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init#Example:_Access_Control_with_redirect

    Да, я оказался прав.
    Удалил всех пользователей, зарегистрировал повторно и явно указал роль — все заработало как и должно было.

    Остается вопрос — почему ВП сам не подставил роль по умолчанию?
    В документации к wp_insert_user() это описано, в коде функции проверка на этот счет есть…
    Но это уже другая история.
    Всем спасибо.

    Возможно.
    http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init#Example:_Access_Control_with_redirect

    При добавлении чего-то похожего в файл функций темы — оно даже не срабатывало, ставил там die(var_dump('dump here')) не срабатывало, вылетало еще раньше.

    Остается вопрос — почему ВП сам не подставил роль по умолчанию?

    Если код не модифицирован, то вряд ли такое могло произойти http://core.trac.wordpress.org/browser/tags/3.6.1/wp-includes/user.php#L1409
    Дефолтная роль берется из БД.

    При добавлении чего-то похожего в файл функций темы — оно даже не срабатывало,

    Проверил, у меня работает.

    тут есть маленький ньюанс 🙂 при создании массива $userdata параметр я указал вот так

    'role' => ''

    В коде — просто проверка на isset() — итого получили, что после extract() переменная есть, но она пустая.

    Думаю все было так 🙂

    Проверил, у меня работает.

    Сейчас и у меня работает, когда роли явно прописаны, а не пусто там) Я предполагаю, что при отсутствии у пользователя роли (именно пусто в этом поле) ВП закрывает доступ еще до того, как подгрузятся функции темы.

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «Запрет доступа к админке» закрыта для новых ответов.