---
title: Permisos y control de acceso en PrestaShop
section: security
slug: permissions
description: "Control de acceso en PrestaShop: permisos de empleados, isLoggedBack(), control de Tabs, permisos de API y acceso por grupo de clientes."
keywords: prestashop permisos acceso empleado isLoggedBack Tab control API clave grupos clientes seguridad
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/security/permissions"
---

# Permisos y control de acceso en PrestaShop

> Control de acceso en PrestaShop: permisos de empleados, isLoggedBack(), control de Tabs, permisos de API y acceso por grupo de clientes.

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
```


---

*Fuente: [https://ayudaprestashop.es/security/permissions](https://ayudaprestashop.es/security/permissions). Version Markdown generada automaticamente para consumo por LLMs.*
