👤 Permisos y control de acceso en PrestaShop
Actualizado: 2024-12-01
PrestaShop tiene dos sistemas de autenticacion: empleados (Back Office) y clientes (Front Office). Cada uno con su propio modelo de permisos. Los modulos deben verificar siempre el nivel de acceso antes de realizar acciones sensibles.
#Verificar acceso del empleado en el BO
Verificacion de autenticacion y permisos de empleado
php
<?php
// ── Verificar que el empleado esta logueado ──
if (!$this->context->employee->isLoggedBack()) {
// No autenticado — redirigir al login del BO
Tools::redirect($this->context->link->getAdminLink('AdminLogin'));
}
// ── Verificar permisos especificos del empleado ──
$employee = $this->context->employee;
$idTab = (int) Tab::getIdFromClassName('AdminMyController');
$permissions = $employee->getPermissions();
// Comprobar permiso de lectura
if (!$permissions[$idTab]['view']) {
die('Sin permiso de lectura');
}
// Comprobar permiso de edicion
if (!$permissions[$idTab]['edit']) {
die('Sin permiso de edicion');
}
// Comprobar si es SuperAdmin
if ($employee->id_profile == _PS_ADMIN_PROFILE_) {
// SuperAdmin siempre tiene acceso
}
// ── En ModuleAdminController — verificacion automatica ──
// Si el Tab esta registrado con el modulo, PS verifica automaticamente
// que el empleado tenga acceso al Tab antes de cargar el controller
#Permisos de Tab (paginas del BO)
Gestionar permisos de Tab por perfil
php
<?php
// ── Al instalar el Tab, establecer permisos por defecto ──
private function installTab(): bool
{
$tab = new Tab();
$tab->class_name = 'AdminMyModule';
$tab->module = $this->name;
$tab->id_parent = (int) Tab::getIdFromClassName('AdminCatalog');
foreach (Language::getLanguages() as $lang) {
$tab->name[$lang['id_lang']] = 'Mi Modulo';
}
if (!$tab->add()) {
return false;
}
// Dar acceso a todos los perfiles excepto Guest
$profiles = Profile::getProfiles(Context::getContext()->language->id);
foreach ($profiles as $profile) {
if ($profile['id_profile'] == _PS_GUEST_PROFILE_) {
continue; // Saltar el perfil invitado
}
// Dar todos los permisos
Access::updateLgcAccess($profile['id_profile'], $tab->id, 'view', 1);
Access::updateLgcAccess($profile['id_profile'], $tab->id, 'add', 1);
Access::updateLgcAccess($profile['id_profile'], $tab->id, 'edit', 1);
Access::updateLgcAccess($profile['id_profile'], $tab->id, 'delete', 1);
}
return true;
}
#Autenticacion del cliente en el FO
Verificar autenticacion del cliente en FrontController
php
<?php
class MyModulePrivateFrontController extends ModuleFrontController
{
// ── Forzar autenticacion antes de cargar la pagina ──
public function checkAccess(): bool
{
if (!$this->context->customer->isLogged()) {
// Redirigir al login y volver despues
Tools::redirect(
$this->context->link->getPageLink('authentication', null, null, [
'back' => urlencode($this->context->link->getModuleLink(
$this->module->name,
$this->php_self
))
])
);
return false;
}
return true;
}
public function initContent(): void
{
parent::initContent();
// Verificar que el recurso pertenece al cliente actual
$idOrder = (int) Tools::getValue('id_order');
$order = new Order($idOrder);
// ¡CRITICO! Verificar que el pedido pertenece al cliente logueado
if ((int) $order->id_customer !== (int) $this->context->customer->id) {
header('HTTP/1.1 403 Forbidden');
$this->errors[] = 'No tienes acceso a este recurso';
return;
}
// Proceder...
}
}
#Control de acceso por grupo
Verificar grupos del cliente
php
<?php
// ── Grupos de clientes en PrestaShop ──
// _PS_DEFAULT_CUSTOMER_GROUP_ = 3 (Visitante/Invitado)
// _PS_GUEST_GROUP_ = 2 (Invitado no registrado)
// _PS_CUSTOMER_GROUP_ = 1 (Cliente registrado)
$customer = $this->context->customer;
// ── Verificar si el cliente esta en un grupo especifico ──
$customerGroups = Customer::getGroupsStatic($customer->id);
$vipGroupId = (int) Configuration::get('MYMODULE_VIP_GROUP_ID');
if (!in_array($vipGroupId, $customerGroups)) {
// El cliente no es VIP — denegar acceso
Tools::redirect($this->context->link->getPageLink('index'));
return;
}
// ── En un hook — mostrar contenido diferente por grupo ──
public function hookDisplayHome(array $params): string
{
$groups = Customer::getGroupsStatic(
(int) $this->context->customer->id
);
if (in_array($vipGroupId, $groups)) {
return $this->display(__FILE__, 'views/templates/hook/vip_block.tpl');
}
return $this->display(__FILE__, 'views/templates/hook/standard_block.tpl');
}
#Permisos en el WebService
Verificar permisos de API en el WebService
php
<?php
// ── Permisos de la clave API ──
// Los permisos se configuran en el BO para cada clave:
// Admin → WebService → Editar clave → Permisos por recurso
// ── En un recurso personalizado — limitar metodos ──
public function hookAddWebserviceResources(): array
{
return [
'mymodule_items' => [
'class' => 'MyModuleItem',
'description' => 'Items del modulo',
// Solo GET y PUT permitidos (no POST ni DELETE)
'forbidden_method' => ['POST', 'DELETE'],
],
];
}
// ── Verificar la autenticacion en una accion WS ──
// PS verifica automaticamente la API key y los permisos del recurso
// antes de llamar al recurso. Si la key no tiene permiso:
// → HTTP 403 Forbidden
// ── Rotar API keys regularmente ──
// Generar una nueva clave en el BO cuando una se compromete:
// Admin → WebService → Editar clave → Regenerar
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.