kutombawewe.net

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

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, 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.

11
Isidro Baquero

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

Use 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
}
9
Nick

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

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);
 }
4
Sahil Purav