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.

Isidro Baquero
fonte

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
}
usuario
fonte
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/>';
}
PIB
fonte
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);
 }
Sahil Purav
fonte