如何限制对自定义组件视图的访问?


11

在我的自定义组件中,我希望能够将特定视图限制为仅特定用户组。如果我为其中一个视图创建一个菜单项,那将很容易做到:我只需选择该菜单项的访问级别即可。

现在,问题来了,如果有人尝试直接使用option = com_mycomponent访问URL,或者我组件的任何内部重定向都转到没有分配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测试对其的访问?

提前致谢。

Answers:


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
}

嗯...有趣的方法。听起来更干净,您将所有逻辑放在特定的位置。与直接在组件中执行相比,我认为这在性能方面会有些“差劲”,但可能只是无关紧要的额外毫秒,对吗?
Isidro Baquero 2014年

相对而言,您可以说...毫秒级的性能影响仍然不会对组件的整体性能产生太大的影响,并且在打算使用所有这些触发器之后:)以及在组件本身中添加其他代码并创建的意义何在?困惑
尼克

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/>';
}

感谢GDP。这部分或多或少受到控制。因此,我知道在每个视图上都使用该“正确方法”吗?
Isidro Baquero

除非要限制所有视图,否则必须设置一些组件参数,或者用于每种功能的辅助函数。
GDP

有趣的...我应该去哪里继续研究通过组件参数限制视图?再次感谢!
Isidro Baquero 2014年

听起来您可能也想了解Joomla ACL,但我只能建议Google进行研究,或者在component-creator.com上尝试一个组件,看看它是如何工作的。他们生成的代码包括设置变量,如$ canCreate,$ canEdit和$ canCheckin。一旦您真正熟悉了ACL,就可以设置自己的ACL规则,例如$ canView。所有这些只是建议-它是编程语言,您可以采用一千种不同的方式来实现。
GDP

大声笑!好的好的。明白了,谢谢。太多的学习...
圣伊西德罗Baquero

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);
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.