Como restringir o acesso às visualizações de componentes personalizados?


11

No meu componente personalizado, gostaria de restringir visualizações específicas a apenas determinados grupos de usuários. Se eu criar um item de menu para uma das minhas visualizações, isso é muito fácil: basta selecionar o nível de acesso para esse item de menu e pronto.

Agora, o problema surge se alguém tentar acessar diretamente uma URL com a opção = com_mycomponent, ou qualquer redirecionamento interno do meu componente for para uma página sem Itemid atribuído ... nesse caso, é o próprio componente que precisa para verificar o grupo de usuários e determinar se é capaz de visualizar essa página ... como posso restringir isso no meu código? Apenas uma verificação simples codificada para o grupo de usuários do usuário? Ou existe uma maneira "padrão" de fazer isso?

Estive verificando a documentação e encontrei o seguinte:

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

mas é para o que o usuário pode fazer, não para o que o usuário pode ver. Eu também encontrei este tópico no fórum:

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

o código no começo é bastante antigo, mas no final é recomendável usar isso:

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

Como devo proceder para isso? Devo definir ativos para o objeto principal gerado pela minha visualização para testar o acesso a ele com o JUser?

Desde já, obrigado.

Respostas:


9

Você pode criar um plug-in do sistema para manipular toda a solicitação do seu componente personalizado antes de enviar o controle para o componente.

Use o evento onAfterRoute para executar toda a verificação de acesso.

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
}

Hmmm ... abordagem interessante. Parece mais limpo e você colocaria toda a lógica em um local específico. Eu acho que isso será um pouco "pior" em termos de desempenho do que fazer diretamente no componente, mas provavelmente apenas milissegundos extras irrelevantes, certo?
— Isidro Baquero 26/11

Bem, comparativamente, você pode dizer que ... ainda esse impacto no desempenho de milissegundos não cria muito impacto no desempenho geral do componente e, afinal, esses gatilhos devem ser usados ​​:) e qual é o objetivo de adicionar código adicional no próprio componente e criar confusão
— Nick

4

Aqui está o código que você precisa para começar, mostrando como ver em quais grupos um usuário está.

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

Graças ao PIB. Esta parte estava mais ou menos sob controle. Então, eu entendo que o "caminho certo" para fazer isso é usá-lo em todas as visualizações?
— Isidro Baquero

Você precisaria, a menos que queira restringir todas as visualizações, caso em que configuraria alguns parâmetros do componente ou uma função auxiliar usada para todas as visualizações.
— GDP

Interessante ... onde posso continuar pesquisando sobre restringir visualizações por meio de parâmetros de componentes? Obrigado novamente!
— Isidro Baquero

Parece que você provavelmente deseja aprender sobre o Joomla ACL também, mas só posso sugerir o Google para pesquisa ou experimentar um componente no component-creator.com e ver como tudo funciona. Seu código gerado inclui a configuração de variáveis ​​como $ canCreate, $ canEdit e $ canCheckin. Quando você estiver realmente familiarizado com a ACL, poderá definir sua própria regra da ACL como $ canView. Todas apenas sugestões - é programação, você pode fazer isso de mil maneiras diferentes.
— GDP

RI MUITO! Ok ok Compreendido, obrigado. Demais para aprender ...
— Isidro Baquero

4

Provavelmente a resposta tardia para esta pergunta. Mas aqui está o que eu usei:

No arquivo controller.php principal, substituí a função de exibição da seguinte maneira:

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);
 }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.