LinuxParty
14- Añadiendo el control de acceso (ACL)
Con el control de acceso de joomla!, podemos definir la posibilidad de permitir o negar acciones en nuestro componente. En este ejemplo usamos las acciones que se definen en el núcleo de Joomla!. Para el componente en su conjunto: core.admin (acceso a la configuración) y core.manage (acceso desde la administración). Y en las acciones de los distintos niveles, como crear, eliminar y editar. Además de las acciones del núcleo, puedes definir tus propias acciones, pero que a menudo no es necesario y no se muestra en este ejemplo. Acceso de Lectura / Escritura no se gestiona a través de esas acciones, pero si con niveles de acceso de las Vista; consulte la documentación general sobre Joomla! ACL para eso.
En la tabla # __assets la lista actual almacena: que grupos de usuarios se les concede o se les deniega hacer que acciones y en que recurso (assets). Esta es la implementación de la lista de control de acceso (ACL).
En este artículo vamos a mostrar cómo agregar y utilizar los permisos de acceso a diferentes niveles de granularidad: para el componente como un todo, para las categorías y para los elementos individualmente.
Requisitos mínimos de ACL a nivel de componente
Hay dos acciones que deben ser definidas a nivel de componente para los componentes en Joomla! 2.5, para ofrecer un soporte básico de ACL.
- Configuración (core.admin): ¿Qué grupos tiene permitido configurar el componente a través del botón “Opciones” de la barra de herramientas?
- Acceso (core.manage): ¿Qué grupos tienen acceso al componente desde la administración?
Este soporte básico de ACL se realiza en 4 pasos sencillos:
- Añadir los dos requisitos mínimos a nivel de componente en el archivo access.xml
- Añadir los permisos fieldset en el archivo config.xml
- Añadir el botón “Opciones” en la barra de herramienta
- Restringir el acceso al componente desde la administración
Añadir los dos requisitos mínimos a nivel de componente en el archivo access.xml
Agregar un archivo access.xml a la raíz de la carpeta admin. Coloque las 2 acciones básicas para el componente com_helloworld en este archivo.
<?xml version="1.0" encoding="utf-8" ?>
<access component="com_helloworld">
<section name="component">
<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
</section>
</access>
Añadir los permisos fieldset en el archivo config.xml
Agregue los siguientes permisos fieldset en el archivo admin/config.xml con el fin de ser capaz de establecer permisos de nivel en nuestros componente:
<fieldset
name="permissions"
label="JCONFIG_PERMISSIONS_LABEL"
description="JCONFIG_PERMISSIONS_DESC"
>
<field
name="rules"
type="rules"
label="JCONFIG_PERMISSIONS_LABEL"
class="inputbox"
validate="rules"
filter="rules"
component="com_helloworld"
section="component"
/>
</fieldset>
Vea más abajo un ejemplo más elaborado del archivo config.xml , como ejemplo adicional para el lugar exacto dónde insertar este código.
Agregar el botón 'Opciones' a la barra de herramientas, siempre y cuando, el usuario está autorizado a ello
Añadir las siguientes líneas en el archivo admin/views/helloworlds/view.html.php :
// Botón Opciones.
if (JFactory::getUser()->authorise('core.admin', 'com_helloworld'))
{
JToolBarHelper::preferences('com_helloworld');
}
Vea más abajo un ejemplo mejor elaborado de admin/views/helloworlds/view.html.php donde JToolBarHelper::preferences('com_helloworld') se realiza en el método addToolBar() junto con los otros botones de la barra de herramientas y la comprobación JUser->authorise() que se realiza en el archivo helper admin/helpers/helloworld.php , dando lugar a las propiedades $canDo .
Restringir el acceso al componente desde la administración, a grupos de usuarios autorizados
Para controlar esto, debes ingresar las siguientes líneas en el archivo admin/helloworld.php :
// Verificación de Acceso: Este usuario puede acceder al componente desde la administración?
if (!JFactory::getUser()->authorise('core.manage', 'com_helloworld'))
{
return JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR'));
}
Vea más abajo un ejemplo mejor elaborado de todo el código del archivo admin/helloworld.php.
Añadir más acciones a nivel de categoría y a nivel de elemento
Al agregar más acciones y más niveles, los cuatro pasos anteriormente descritos se realizan también. Pero esto provoca que también tengamos que hacer los siguientes pasos:
- Añadir la columna asset_id a la tabla de la base de datos para el control de acceso a nivel de artículo
- Guarde los permisos en la tabla assets. Sobre todo tener cuidado de establecer el asset_id como parent-asset.
- Realice los ajustes de los permisos editables a nivel de elemento
- Agregue un poco de cadenas de idioma
Describir las acciones para controlar el acceso a
Cada componente (o parte de él) tiene su propio conjunto de permisos que pueden ser controlados. Se describe en el archivo access.xml que se encuentra en la raíz de la carpeta de admin. En este ejemplo las acciones cuyo acceso está controlado se dividen en tres secciones: a nivel de componente, a nivel de categoría y a nivel del elemento. Un "elemento" es un "message" en nuestro componente de ejemplo, de ahí el nombre de la tercera sección.
<?xml version="1.0" encoding="utf-8" ?>
<access component="com_helloworld">
<section name="component">
<action name="core.admin" title="JACTION_ADMIN" description="JACTION_ADMIN_COMPONENT_DESC" />
<action name="core.manage" title="JACTION_MANAGE" description="JACTION_MANAGE_COMPONENT_DESC" />
<action name="core.create" title="JACTION_CREATE" description="JACTION_CREATE_COMPONENT_DESC" />
<action name="core.delete" title="JACTION_DELETE" description="JACTION_DELETE_COMPONENT_DESC" />
<action name="core.edit" title="JACTION_EDIT" description="JACTION_EDIT_COMPONENT_DESC" />
</section>
<section name="category">
<action name="core.create" title="JACTION_CREATE" description="COM_CATEGORIES_ACCESS_CREATE_DESC" />
<action name="core.delete" title="JACTION_DELETE" description="COM_CATEGORIES_ACCESS_DELETE_DESC" />
<action name="core.edit" title="JACTION_EDIT" description="COM_CATEGORIES_ACCESS_EDIT_DESC" />
<action name="core.edit.state" title="JACTION_EDITSTATE" description="COM_CATEGORIES_ACCESS_EDITSTATE_DESC" />
<action name="core.edit.own" title="JACTION_EDITOWN" description="COM_CATEGORIES_ACCESS_EDITOWN_DESC" />
</section>
<section name="message">
<action name="core.delete" title="JACTION_DELETE" description="COM_HELLOWORLD_ACCESS_DELETE_DESC" />
<action name="core.edit" title="JACTION_EDIT" description="COM_HELLOWORLD_ACCESS_EDIT_DESC" />
</section>
</access>
Agregar la configuración de permisos en las preferencias del componente
Puesto que ahora se pueden utilizar los permisos de control de acceso en nuestro componente, tenemos que ser capaces de establecerlos desde nuestro componente. Esto se hace en las preferencias de este componente: la pantalla que aparece después de hacer clic en el botón "Opciones". El archivo config.xml es una forma de definición para las Preferencias. Podríamos definir también aquí las acciones a nivel del componente, pero ahora es preferible poner estas acciones en el archivo access.xml: de esa manera todas las reglas de acceso de este componente se encuentran en un solo lugar.
admin/config.xml
<?xml version="1.0" encoding="utf-8"?>
<config>
<fieldset
name="greetings"
label="COM_HELLOWORLD_CONFIG_GREETING_SETTINGS_LABEL"
description="COM_HELLOWORLD_CONFIG_GREETING_SETTINGS_DESC"
>
<field
name="show_category"
type="radio"
label="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_FIELD_SHOW_CATEGORY_DESC"
default="0"
>
<option value="0">JHIDE</option>
<option value="1">JSHOW</option>
</field>
</fieldset>
<fieldset
name="permissions"
label="JCONFIG_PERMISSIONS_LABEL"
description="JCONFIG_PERMISSIONS_DESC"
>
<field
name="rules"
type="rules"
label="JCONFIG_PERMISSIONS_LABEL"
class="inputbox"
validate="rules"
filter="rules"
component="com_helloworld"
section="component"
/>
</fieldset></config>
Viendo sólo los botones adecuados de la barra de herramientas
Los botones de la barra de herramientas a mostrar depende de los permisos de control de acceso para el usuario. Ponemos todos los permisos para este usuario en la propiedad $canDo de la vista, de modo que al final pueda referirse a ella en los diseños (en la edición de los formularios, por ejemplo).
En el archivo admin/views/helloworlds/view.html.php ubicamos las siguientes líneas:
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');
// Importar biblioteca view de Joomla
jimport('joomla.application.component.view');
/**
* Vista HelloWorlds
*/
class HelloWorldViewHelloWorlds extends JViewLegacy
{
protected $items;
protected $pagination;
protected $canDo;
/**
* metodo para mostrar la vista HelloWorlds
* @return void
*/
function display($tpl = null)
{
// Obtener los datos del modelo
$this->items = $this->get('Items');
$this->pagination = $this->get('Pagination');
// ¿Qué tipos de permiso tiene este usuario? ¿Qué puede el o ella hacer?
$this->canDo = HelloWorldHelper::getActions();
// Verificar existencia de errores
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}
// Establecer la barra de herramientas
$this->addToolBar();
// Mostrar la plantilla
parent::display($tpl);
// Establecer el documento
$this->setDocument();
}
/**
* Setting the toolbar
*/
protected function addToolBar()
{
JToolBarHelper::title(JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLDS'), 'helloworld');
if ($this->canDo->get('core.create'))
{
JToolBarHelper::addNew('helloworld.add', 'JTOOLBAR_NEW');
}
if ($this->canDo->get('core.edit'))
{
JToolBarHelper::editList('helloworld.edit', 'JTOOLBAR_EDIT');
}
if ($this->canDo->get('core.delete'))
{
JToolBarHelper::deleteList('', 'helloworlds.delete', 'JTOOLBAR_DELETE');
}
if ($this->canDo->get('core.admin'))
{
JToolBarHelper::divider();
JToolBarHelper::preferences('com_helloworld');
}
}
/**
* Método para configurar las propiedades del documento
*
* @return void
*/
protected function setDocument()
{
$document = JFactory::getDocument();
$document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION'));
}
}
En el archivo admin/views/helloworld/view.html.php ubica las siguientes líneas:
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');
// Importar biblioteca view de Joomla
jimport('joomla.application.component.view');
/**
* Vista HelloWorld
*/
class HelloWorldViewHelloWorld extends JViewLegacy
{
protected $form;
protected $item;
protected $script;
protected $canDo;
/**
* Mostrar el metodo de la vista Hello
* @return void
*/
public function display($tpl = null)
{
// Obtener los datos
$this->form = $this->get('Form');
$this->item = $this->get('Item');
$this->script = $this->get('Script');
// ¿Qué tipos de permiso tiene este usuario? ¿Qué puede el o ella hacer?
$this->canDo = HelloWorldHelper::getActions($this->item->id);
// Verificar existencia de errores
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}
// Establecer la barra de herremienta
$this->addToolBar();
// Mostrar la plantilla
parent::display($tpl);
// Establecer el documento
$this->setDocument();
}
/**
* Configuración de la barra de herramienta
*/
protected function addToolBar()
{
$input = JFactory::getApplication()->input;
$input->set('hidemainmenu', true);
$user = JFactory::getUser();
$userId = $user->id;
$isNew = $this->item->id == 0;
JToolBarHelper::title($isNew ? JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_NEW')
: JText::_('COM_HELLOWORLD_MANAGER_HELLOWORLD_EDIT'), 'helloworld');
// Construir las acciones para los registros nuevos y existentes.
if ($isNew)
{
// Para los nuevos registros, comprobar el permiso create
if ($this->canDo->get('core.create'))
{
JToolBarHelper::apply('helloworld.apply', 'JTOOLBAR_APPLY');
JToolBarHelper::save('helloworld.save', 'JTOOLBAR_SAVE');
JToolBarHelper::custom('helloworld.save2new', 'save-new.png', 'save-new_f2.png',
'JTOOLBAR_SAVE_AND_NEW', false);
}
JToolBarHelper::cancel('helloworld.cancel', 'JTOOLBAR_CANCEL');
}
else
{
if ($this->canDo->get('core.edit'))
{
// Podemos guardar el nuevo registro
JToolBarHelper::apply('helloworld.apply', 'JTOOLBAR_APPLY');
JToolBarHelper::save('helloworld.save', 'JTOOLBAR_SAVE');
// Podemos guardar este registro, pero revise el permiso create a ver
// si podemos volver a hacer uno nuevo.
if ($this->canDo->get('core.create'))
{
JToolBarHelper::custom('helloworld.save2new', 'save-new.png', 'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
}
}
if ($this->canDo->get('core.create'))
{
JToolBarHelper::custom('helloworld.save2copy', 'save-copy.png', 'save-copy_f2.png',
'JTOOLBAR_SAVE_AS_COPY', false);
}
JToolBarHelper::cancel('helloworld.cancel', 'JTOOLBAR_CLOSE');
}
}
/**
* Método para configurar las propiedades del documento
*
* @return void
*/
protected function setDocument()
{
$isNew = $this->item->id == 0;
$document = JFactory::getDocument();
$document->setTitle($isNew ? JText::_('COM_HELLOWORLD_HELLOWORLD_CREATING')
: JText::_('COM_HELLOWORLD_HELLOWORLD_EDITING'));
$document->addScript(JURI::root() . $this->script);
$document->addScript(JURI::root() . "/administrator/components/com_helloworld"
. "/views/helloworld/submitbutton.js");
JText::script('COM_HELLOWORLD_HELLOWORLD_ERROR_UNACCEPTABLE');
}
}
Estos dos archivos utilizan el método definido getActions en el archivo admin/helpers/helloworld.php:
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die;
/**
* Componente HelloWorld helper.
*/
abstract class HelloWorldHelper
{
/**
* Configurar la barra de enlaces.
*/
public static function addSubmenu($submenu)
{
JSubMenuHelper::addEntry(JText::_('COM_HELLOWORLD_SUBMENU_MESSAGES'),
'index.php?option=com_helloworld', $submenu == 'messages');
JSubMenuHelper::addEntry(JText::_('COM_HELLOWORLD_SUBMENU_CATEGORIES'),
'index.php?option=com_categories&view=categories&extension=com_helloworld',
$submenu == 'categories');
// establecer algunas propiedades globales
$document = JFactory::getDocument();
$document->addStyleDeclaration('.icon-48-helloworld ' .
'{background-image: url(/../media/com_helloworld/images/tux-48x48.png);}');
if ($submenu == 'categories')
{
$document->setTitle(JText::_('COM_HELLOWORLD_ADMINISTRATION_CATEGORIES'));
}
}
/**
* Obtener las acciones
*/
public static function getActions($messageId = 0)
{
jimport('joomla.access.access');
$user = JFactory::getUser();
$result = new JObject;
if (empty($messageId))
{
$assetName = 'com_helloworld';
}
else {
$assetName = 'com_helloworld.message.'.(int) $messageId;
}
$actions = JAccess::getActions('com_helloworld', 'component');
foreach ($actions as $action)
{
$result->set($action->name, $user->authorise($action->name, $assetName));
}
return $result;
}
}
Restringir el acceso al componente
La idea principal en el ACL es restringir las acciones a grupos de usuarios. La primera medida que ha restringido es el acceso del propio componente por la administración. Con tu editor favorito agrega esta líneas al archivo admin/helloworld.php :
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');
// Verificación de acceso: ¿Este usuario puede acceder al componente desde la administración?
if (!JFactory::getUser()->authorise('core.manage', 'com_helloworld'))
{
return JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR'));
}
// Requiere del archivo helper
JLoader::register('HelloWorldHelper', dirname(__FILE__) . '/helpers/helloworld.php');
// Importar biblioteca controller de Joomla
jimport('joomla.application.component.controller');
// Obtener una instancia del controlador prefijado por HelloWorld
$controller = JController::getInstance('HelloWorld');
// Realice la tarea Solicitada
$input = JFactory::getApplication()->input;
$controller->execute($input->getCmd('task'));
// Redirigir si se define por el controlador
$controller->redirect();
Agregue la columna asset_id a la tabla de la base de datos
Con el fin de ser capaz de trabajar con JTable la columna asset_id tiene que ser creada en la tabla #__helloworld . Así que, admin/sql/install.mysql.utf8.sql se convierte en:
DROP TABLE IF EXISTS `#__helloworld`;
CREATE TABLE `#__helloworld` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`asset_id` INT(10) NOT NULL DEFAULT '0', `greeting` varchar(25) NOT NULL,
`catid` int(11) NOT NULL DEFAULT '0',
`params` TEXT NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
);
INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');
Para las actualizaciones se añade en el archivo admin/sql/updates/mysql/0.0.14.sql :
ALTER TABLE`#__helloworld` ADD COLUMN `asset_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `id`;
Restringir el acceso a los mensajes
Hasta ahora hemos restringido el acceso al componente en sí, pero también tenemos que hacerlo a nivel de mensaje.
Para verificar el permiso “core.delete” necesitamos modificar la clase del modelo admin/models/helloworld.php añadiendo las siguientes líneas:
/**
* Método para comprobar si está preparado para borrar un mensaje. Sobrescribe JModelAdmin::canDelete
*/
protected function canDelete($record)
{
if( !empty( $record->id ) ){
$user = JFactory::getUser();
return $user->authorise( "core.delete", "com_helloworld.message." . $record->id );
}
Para comprobar el "core.edit" (y el “core.add” si lo desea) necesitas actualizar el sub-controlador (no el modelo). No estoy seguro de porqué esto es así, pero así es como otros componentes estándar de Joomla! lo hacen. Es necesario añadir las siguientes líneas en el archivo: /admin/controllers/helloworld.php
/**
* Aplicar allowAdd o no
*
* No se utiliza en este momento (pero se puede ver cómo otros componentes lo usan ....)
* Sobreescribiendo: JControllerForm::allowAdd
*
* @paramarray $data
* @return bool
*/
protected function allowAdd($data = array())
{
return parent::allowAdd($data);
}
/**
* Implementar para permitir o no editar
* Sobreescribiendo: JControllerForm::allowEdit
*
* @paramarray $data
* @paramstring $key
* @return bool
*/
protected function allowEdit($data = array(), $key = 'id')
{
$id = isset( $data[ $key ] ) ? $data[ $key ] : 0;
if( !empty( $id ) ){
$user = JFactory::getUser();
return $user->authorise( "core.edit", "com_helloworld.message." . $id );
}
}
Tenga en cuenta que allowAdd simplemente llama al padre. Lo he puesto aquí en caso de que quiera hacer uso de ella en su componente. Si nos fijamos en el archivo admin/access.xml te darás cuenta de que no hay acción core.add definido para "messages", por lo que tendrá que añadirlo también allí si quieres ser capaz de configurar la interfaz.
Desarrollo de componentes en Joomla 2.5 (6 de 8) | Desarrollo de componentes en Joomla 2.5 (8 de 8)
-
Programación
- Thomas E. Kurtz, coinventor de BASIC, muere a los 96 años
- Profesor de informática del MIT prueba el impacto de la IA en la formación de programadores
- Lanzamiento del IDE de código abierto Qt Creator 14 con soporte para complementos basados en Lua
- Plantillas para Joomla - Episodio 1: Plantillas, marcos y clubes o no...
- Este es el mejor libro que he visto para aprender a programar en Python en castellano desde cero, gratis y online
- ¿Deberían los niños seguir aprendiendo a programar en la era de la IA?
- La 'obsolescencia' de VBScript confirmada por Microsoft y su eventual eliminación de Windows
- El Gran Debate: ¿Deberían los Modelos de Inteligencia Artificial Ser de Código Abierto?
- El lenguaje de programación BASIC cumple 60 años
- El CEO de Nvidia dice que los niños no deberían aprender a programar
- 40 años de Turbo Pascal: recuerdos del dinosaurio codificador que revolucionó los IDE
- Los lenguajes de programación más populares y dónde aprenderlos.
- Top 5 de los principales lenguajes de programación para desarrollar aplicaciones de escritorio Linux
- Qt Creator 12 lanzado con complementos de grabación de pantalla y Explorador de compiladores
- 10 sitios web para practicar problemas de programación