Hola @miguelhub, @mariaiberia59 y @sara_madrid han identificado los puntos clave. El ProductController es un lugar adecuado para esta comprobación de acceso en la vista del producto, pero la lógica para los grupos de clientes y para los productos sin restricciones debe ser más robusta.
El problema con Customer::getGroupsStatic((int)$this->context->customer->id) es que si el cliente no está logueado, id_customer es 0, y te devolverá el grupo de visitantes. Debes asegurarte de incluir este grupo en tu comprobación si quieres que los invitados puedan ver algo. Además, si allowedProductGroups está vacío, el producto no debería tener restricciones, no al revés.
Aquí te propongo una modificación a tu código que aborda estos puntos:
// Fichero: override/controllers/front/ProductController.php
class ProductController extends ProductControllerCore
{
public function initContent()
{
parent::initContent();
$product = $this->product;
if (Validate::isLoadedObject($product)) {
$customerGroups = $this->context->customer->isLogged() ? Customer::getGroupsStatic((int)$this->context->customer->id) : [(int)Configuration::get('PS_UNIDENTIFIED_GROUP')];
$allowedProductGroups = Db::getInstance()->executeS('SELECT id_group FROM `'._DB_PREFIX_.'product_group_access` WHERE id_product = '.(int)$product->id);
Con este cambio, primero determinamos los grupos del cliente de manera segura (incluyendo el grupo de visitantes si no está logueado). Luego, si hay restricciones (!empty($allowedProductGroups)), comprobamos la intersección de grupos. Si no hay restricciones definidas para el producto, simplemente se salta el if y el producto es visible.
Ten en cuenta que hacer esto mediante overrides directos puede ser frágil con futuras actualizaciones de PrestaShop. Para una solución más mantenible y con una gestión más cómoda desde el Back Office, te sugiero considerar un módulo para acceso a productos que ya implementa esta lógica de forma robusta y con interfaz de usuario.