Як обмежити доступ до користувацьких переглядів компонентів?


11

У своєму спеціальному компоненті я хотів би мати можливість обмежувати конкретні представлення лише певними групами користувачів. Якщо я створюю пункт меню для одного з моїх переглядів, це зробити досить просто: я просто вибираю рівень доступу для цього пункту меню, і я закінчую.

Тепер проблема виникає, якщо хтось намагається отримати доступ безпосередньо до URL-адреси з параметром = com_mycomponent, або будь-яке внутрішнє перенаправлення мого компонента переходить на сторінку з не присвоєним Itemid ... щоб перевірити групу користувачів і визначити, чи може вона переглядати цю сторінку ... як я можу обмежити це у своєму коді? Просто проста перевірка жорсткого коду для групи користувачів? Або існує "стандартний" спосіб для цього?

Я перевіряв документацію і виявив таке:

http://docs.joomla.org/J2.5:How_to_implement_action_in_your_code

але це те, що може зробити користувач, а не те, що може бачити користувач. Я також знайшов цю тему на форумі:

http://forum.joomla.org/viewtopic.php?t=530721

код на початку досить старий, але в кінці рекомендується використовувати такий:

http://api.joomla.org/cms-3/classes/JUser.html#method_authorise

Як мені діяти для цього? Чи слід визначити активи для основного об'єкта, згенерованого моїм представленням, щоб я міг перевірити доступ до нього за допомогою JUser?

Заздалегідь спасибі.

Відповіді:


9

Ви можете створити системний плагін для обробки всіх запитів до вашого користувальницького компонента, перш ніж надсилати управління компоненту.

Використовуйте подію onAfterRoute, щоб здійснити всю перевірку доступу.

function onAfterRoute()
{
  $user = JFactory::getUser();
  $groups = $user->groups;

  $jinput = JFactory::getApplication()->input;
  $option = $jinput->get('option', '');
  $view   = $jinput->get('view', '');

  // place USER-GROUP related checking here
}

Гммм ... цікавий підхід. Звучить чистіше, і ви поставите всю логіку в певному місці. Я думаю, це буде дещо «гірше» в плані продуктивності, ніж робити це безпосередньо в компоненті, але, ймовірно, лише неактуальні додаткові мілісекунди, правда?
— Ісідро Бакеро

добре порівняно ви можете сказати, що ... все ж цей хіт мілісекундної продуктивності не створює особливого впливу на загальну продуктивність компонента, і після цього всі ці тригери призначені для використання :) і який сенс додавати додатковий код у сам компонент і створювати плутанина
— Нік

4

Ось код, з якого потрібно почати, показуючи, як бачити, в яких групах входить користувач.

$user = JFactory::getUser();
$groups = $user->groups;
if($user->id) {
    echo $user->username.' is logged in<Br/>';
    if (isset($groups[8])) echo " - User is a Super User <Br/>";
    if (isset($groups[7])) echo " - User is an Administrator <Br/>";
    if (isset($groups[6])) echo " - User is an Manager <Br/>";
}else{
    echo 'Not logged in<Br/>';
}

Завдяки ВВП. Ця частина більш-менш була під контролем. Тож я розумію "правильний спосіб" це зробити, використовуючи це на кожному погляді?
— Ісідро Бакеро

Якщо вам не доведеться обмежувати всі представлення даних, вам доведеться встановити деякі параметри компонента або допоміжну функцію, яка використовується для кожної несправності.
— ВВП

Цікаво ... куди я можу продовжити дослідження щодо обмеження поглядів за допомогою параметрів компонента? Знову дякую!
— Ісідро Бакеро

Здається, ви, напевно, хочете дізнатися і про Joomla ACL, але я можу лише запропонувати Google для дослідження або спробувати компонент aa на компонент-creator.com і подивитися, як це все працює. Їх генерований код включає змінні налаштування, такі як $ canCreate, $ canEdit та $ canCheckin. Після того як ви дійсно знайомі з ACL, ви можете встановити своє власне правило ACL, як $ canView. Все просто пропозиції - це програмування, ви можете це зробити тисячею різних способів.
— ВВП

ЛОЛ! Добре-добре. Зрозуміли, дякую. Занадто багато, щоб навчитися ...
— Ісідро Бакеро

4

Напевно, пізня відповідь на це питання. Але ось що я використав:

У головному файлі controller.php я переосмислив функцію відображення наступним чином:

public function display($cachable = false, $urlparams = array())
{
        $user = JFactory::getUser();
        $app  = JFactory::getApplication();

        $view = $this->input->get('view');

        if ($view == 'someview' || $view == 'anotherview')
        {
            if ($user->get('guest') == 1)
            {
                $uri = JUri::getInstance();
                $this->setRedirect(
                        JRoute::_('index.php?option=com_users&view=login&return=' . base64_encode($uri->toString())), $app->enqueueMessage(JText::_('COM_YOURCOMPONENT_LOGIN_REQUIRED'), 'warning')
                );

                return;
            }
         }

        parent::display($cachable, $urlparams);
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.