Как ограничить доступ к пользовательским представлениям компонентов?

11

В моем пользовательском компоненте я хотел бы иметь возможность ограничивать определенные представления только определенными группами пользователей. Если я создаю пункт меню для одного из моих представлений, это довольно легко сделать: я просто выбираю уровень доступа для этого пункта меню, и все готово.

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

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

http://docs.joomla.org/J2.5:How_to_implement_actions_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/>';
}
ВВП
источник
Спасибо ВВП. Эта часть более или менее была под контролем. Итак, я понимаю, что «правильный путь» сделать это - использовать это в каждом представлении?
Исидро Бакеро
Вам придется, если вы не хотите ограничивать все представления, в этом случае вы устанавливаете некоторые параметры компонента или вспомогательную функцию, которая используется для каждого fiew.
ВВП
Интересно ... где я могу продолжать исследовать ограничения представлений через параметры компонента? Еще раз спасибо!
Исидро Бакеро
Похоже, вы, вероятно, тоже хотите узнать о ACL Joomla, но я могу только предложить Google для исследования или попробовать компонент на component-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);
 }
Сахил Пурав
источник