it-swarm.dev

Restringir el acceso a componentes front-end

Estoy desarrollando un componente de Joomla y me gustaría que los administradores tengan la opción de restringir el acceso a una vista particular en el front-end.

Si crea un elemento de menú para esta vista, intente acceder a él a través del menú, aparecerá la página de inicio de sesión del usuario. Todo bien.

Sin embargo, todavía puedo ir directamente a esa vista escribiendo la URL completa (index.php?option=com_mycomponent&view=myRestrictedView)

Me doy cuenta de que necesito poner algo de código en el controlador para verificar el objeto de usuario actual con los permisos que quedan, pero no estoy seguro de por dónde empezar. He visto el tutorial Desarrollando un componente MVC, pero eso se centra en el back-end.

TLDR - ¿Qué código de autorización necesito en mi controller.php para verificar si el usuario está autorizado para esta vista y dónde puedo 'establecer' este nivel de autorización (config.xml tipo de campo accesslevel?)

Creo que la forma más simple es un campo accesslevel en mi config.xml y una llamada a JUser::getAuthorisedViewLevels pero eso parece un poco hacky ...

5
codinghands

El primer lugar para comenzar es con Joomla, si Joomla lo hace, puede leer el código para ver cómo se ha implementado. El modelo ACL actual se introdujo en el inicio de la línea 2.5 (también conocido como 1.6)

Joomla desglosa su funcionalidad ACL en "ver" y "hacer", lo que estás preguntando es ver .

En com_content Puede ver que la vista de Artículo verifica el acceso a la vista en el archivo de clase de vista ContentViewArticle con los siguientes criterios:

    // Check the view access to the article (the model has already computed the values).
    if ($item->params->get('access-view') == false && ($item->params->get('show_noauth', '0') == '0'))
    {
        JError::raiseWarning(403, JText::_('JERROR_ALERTNOAUTHOR'));
        return;
    }

Notará el comentario de que " el modelo ya ha calculado los valores ", en este caso el modelo es ContentModelArticle encontrado en /components/com_content/models/article.php. Hacia el final del método getItem() encontrarás:

// Compute view access permissions.
if ($access = $this->getState('filter.access'))
{
    // If the access filter has been set, we already know this user can view.
    $data->params->set('access-view', true);
}
else
{
    // If no access filter is set, the layout takes some responsibility for display of limited information.
    $user = JFactory::getUser();
    $groups = $user->getAuthorisedViewLevels();

    if ($data->catid == 0 || $data->category_access === null)
    {
        $data->params->set('access-view', in_array($data->access, $groups));
    }
    else
    {
        $data->params->set('access-view', in_array($data->access, $groups) && in_array($data->category_access, $groups));
    }
}

Por supuesto, dependiendo de su extensión, puede tener otros requisitos con los que debe verificar además de la ACL de Joomla. También existe la expectativa muy razonable de que desea controlar lo que los usuarios " están haciendo ".

Para tener una mejor idea de la ACL, la lectura recomendada es probablemente "Lista de control de acceso" y "J25: Tutorial de lista de control de acceso" en sitio web del Doc de Joomla .

7
Craig

La respuesta de @Craig es muy buena, pero JERROR quedará obsoleta en Joomla 4.0. En su lugar, puede usar el código a continuación cuando desee notificar a la IU.

\Joomla\CMS\Factory::getApplication()->enqueueMessage($msg, 'warning')

2
Paulo Griiettner

Usaría http://component-creator.com/ , ACL para vistas frontales está integrado en todos los componentes generados.

0
Andrés Maeso