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


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.