¿Cómo restringir el acceso a vistas de componentes personalizados?

11

En mi componente personalizado, me gustaría poder restringir vistas específicas solo a ciertos grupos de usuarios. Si creo un elemento de menú para una de mis vistas, eso es bastante fácil de hacer: solo selecciono el nivel de acceso para ese elemento de menú y listo.

Ahora, el problema surge si alguien intenta acceder directamente a una URL con option = com_mycomponent, o cualquiera de las redirecciones internas de mi componente va a una página sin Itemid asignado ... en ese caso, es el componente en sí el que necesita para verificar el grupo de usuarios y determinar si puede ver esa página ... ¿cómo puedo restringir eso en mi código? ¿Solo una simple verificación codificada para el grupo de usuarios del usuario? ¿O hay una forma "estándar" de hacerlo?

He estado revisando la documentación y he encontrado esto:

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

pero eso es para lo que el usuario puede hacer, no para lo que el usuario puede ver. También he encontrado este hilo del foro:

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

el código al principio es bastante antiguo, pero al final se recomienda usar esto:

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

¿Cómo debo proceder para eso? ¿Debo definir activos para el objeto principal generado por mi vista para poder probar el acceso con JUser?

Gracias por adelantado.

Isidro Baquero
fuente

Respuestas:

9

Puede crear un complemento del sistema para manejar todas las solicitudes a su componente personalizado antes de enviar el control al componente.

Utilice el evento onAfterRoute para realizar todas las comprobaciones de acceso.

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
}
Mella
fuente
Hmmm ... enfoque interesante. Suena más limpio, y pondrías toda la lógica en un lugar específico. Supongo que esto será un poco "peor" en términos de rendimiento que hacerlo directamente en el componente, pero probablemente solo unos milisegundos adicionales irrelevantes, ¿verdad?
Isidro Baquero
bueno, comparativamente, puedes decir que ... aún así, este golpe de rendimiento de milisegundos no crea mucho impacto en el rendimiento general del componente y después de que todos estos desencadenantes están destinados a ser utilizados :) y cuál es el punto de agregar código adicional en el componente en sí mismo y crear confusión
Nick
4

Aquí está el código que necesita para comenzar a mostrarle cómo ver en qué grupos se encuentra un usuario.

$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
fuente
Gracias PIB. Esta parte estaba más o menos bajo control. ¿Entonces entiendo que la "forma correcta" de hacerlo es usar eso en cada vista?
Isidro Baquero
Tendría que hacerlo, a menos que desee restringir todas las vistas, en cuyo caso configuraría algunos parámetros de componentes o una función auxiliar que se utiliza para cada vista.
PIB
Interesante ... ¿a dónde puedo ir para seguir investigando sobre la restricción de vistas a través de parámetros de componentes? ¡Gracias de nuevo!
Isidro Baquero
Parece que probablemente también quiera aprender sobre la ACL de Joomla, pero solo puedo sugerirle a Google que investigue, o pruebe un componente en component-creator.com y vea cómo funciona todo. Su código generado incluye variables de configuración como $ canCreate, $ canEdit y $ canCheckin. Una vez que esté REALMENTE familiarizado con ACL, puede establecer su propia regla de ACL como $ canView. Solo sugerencias: es programación, puedes hacerlo de mil maneras diferentes.
PIB
Jajaja Bien bien. Entendido, gracias. Demasiado para aprender ...
Isidro Baquero
4

Probablemente la respuesta tardía a esta pregunta. Pero esto es lo que usé:

En el archivo controller.php principal, anulé la función de visualización de la siguiente manera:

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
fuente