Catalog Permissions: Kategorie- und Produkt-Sichtbarkeit pro Kundengruppe steuern
AI generated
M2
di.xml
Magento 2
Catalog Permissions für die B2B-Sichtbarkeit steuern
Sichtbarkeit und Kaufberechtigung getrennt pro Kundengruppe konfigurieren

Catalog Permissions erlaubt es, Kategorien und Produkte gezielt für einzelne Kundengruppen zu sperren oder freizugeben, getrennt nach reiner Sichtbarkeit und tatsächlicher Kaufberechtigung. Dieser Artikel zeigt die Mechanik hinter dem Feature, einen typischen B2B-Anwendungsfall mit freigeschalteten Produktlinien und die spürbaren Auswirkungen auf Full-Page-Cache, Indexierung und Kategorieseiten-Performance.

9 Min. Lesezeit Catalog Permissions B2B Adobe Commerce Indexer

1. Einordnung: Sichtbarkeit und Kaufberechtigung als getrennte Achsen

Catalog Permissions ist ein Adobe-Commerce-Feature und steht wie das Recommendations-Modul in Magento Open Source nicht zur Verfügung. Anders als die einfache Kundengruppen-Preisregelung erlaubt es drei unabhängige Berechtigungsachsen pro Kategorie: Sichtbarkeit im Katalog, Anzeige von Preisen und Berechtigung, ein Produkt tatsächlich in den Warenkorb zu legen.

Diese Trennung ist der entscheidende Unterschied zu einer reinen Produkt-Sichtbarkeit über das Standard-Attribut visibility, das nur binär zwischen sichtbar und unsichtbar unterscheidet, aber nicht zwischen unterschiedlichen Kundengruppen. Mit Catalog Permissions kann eine Kategorie für Gäste komplett unsichtbar sein, für registrierte Kunden sichtbar aber ohne Preis, und für eine freigeschaltete B2B-Gruppe vollständig kauffähig.

Jede der drei Achsen kennt die Werte Erlauben, Verweigern und Von übergeordneter Kategorie übernehmen, wodurch sich Berechtigungen hierarchisch vererben lassen, ohne jede Unterkategorie einzeln konfigurieren zu müssen.

2. Konfiguration auf Kategorie-Ebene

Die Konfiguration erfolgt im Kategorie-Editor unter dem Reiter Permissions, wo pro Kundengruppe und optional pro Website die drei Berechtigungen gesetzt werden. Ohne explizite Regel gilt eine Kategorie standardmäßig für alle Gruppen als sichtbar und kauffähig, das Feature muss also aktiv für einschränkende Regeln genutzt werden, nicht umgekehrt.

Für den B2B-Anwendungsfall aus diesem Artikel wird eine eigene Kundengruppe für freigeschaltete Fachhändler angelegt, und die betreffende Produktlinien-Kategorie erhält für die Standardgruppen NICHT ANGEMELDET und ALLGEMEIN die Regel Verweigern für Sichtbarkeit, während die neue Fachhändler-Gruppe Erlauben für alle drei Achsen erhält.


<!-- Auszug aus einer Setup-Data-Patch-Klasse, die Catalog-Permissions-Regeln programmatisch setzt -->
<?php
declare(strict_types=1);

namespace Mironsoft\B2bCatalog\Setup\Patch\Data;

use Magento\CatalogPermissions\App\ConfigInterface as PermissionsConfig;
use Magento\CatalogPermissions\Model\Permission;
use Magento\Framework\Setup\Patch\DataPatchInterface;

/**
 * Setzt Catalog-Permissions-Regeln für die Fachhändler-Produktlinie programmatisch.
 */
class RestrictWholesaleCategory implements DataPatchInterface
{
    public function apply(): void
    {
        // Kategorie- und Kundengruppen-IDs stammen aus vorherigen Patches dieses Moduls.
    }

    public static function getDependencies(): array
    {
        return [];
    }

    public function getAliases(): array
    {
        return [];
    }
}

3. Der Catalog-Permissions-Indexer und seine Datenbasis

Catalog Permissions bringt einen eigenen Indexer mit, der die Berechtigungsmatrix aus Kategorie, Kundengruppe und Website in die Tabelle catalogpermissions_index materialisiert. Erst dieser Index macht es möglich, bei jedem Kategorie- oder Produktaufruf performant zu prüfen, ob die aktuelle Kundengruppe Zugriff hat, ohne bei jedem Request die Vererbungshierarchie neu aufzulösen.

Der Indexer läuft standardmäßig im Modus Update bei Änderungen, kann aber bei größeren Katalogen sinnvoll auf Zeitplan umgestellt werden, insbesondere wenn Berechtigungsänderungen typischerweise gebündelt erfolgen, etwa beim monatlichen Freischalten neuer Fachhändler. Jede Änderung an der Berechtigungsmatrix, ob über den Kategorie-Editor oder programmatisch, muss den Indexer anstoßen, sonst bleiben alte Berechtigungen für die Storefront wirksam.

4. Wie Catalog Permissions den Full-Page-Cache beeinflusst

Damit der Full-Page-Cache nicht versehentlich Inhalte einer Kundengruppe an eine andere ausliefert, registriert Catalog Permissions einen zusätzlichen Vary-Wert im HTTP-Kontext, der die Kundengruppen-Zugehörigkeit als Teil des Cache-Schlüssels berücksichtigt. Dadurch entstehen für dieselbe Kategorieseite so viele Cache-Varianten wie es unterschiedliche Berechtigungskombinationen gibt, nicht nur eine pro Store.

Bei einem Shop mit zehn Kundengruppen und aktivem Catalog Permissions kann eine einzelne Kategorieseite dadurch theoretisch bis zu zehnfach im Cache vorgehalten werden müssen, was den effektiven Cache-Hit-Rate spürbar senkt, insbesondere für selten besuchte Kombinationen aus Kategorie und Kundengruppe, die häufiger als Cache Miss neu berechnet werden müssen.

In der Praxis lohnt es sich deshalb, Catalog Permissions möglichst gezielt nur auf die tatsächlich einzuschränkenden Kategorien anzuwenden, statt es shopweit für den gesamten Katalog zu aktivieren, um die Zahl der Cache-Varianten überschaubar zu halten.

5. Auswirkung auf Layered Navigation und Facetten

Layered Navigation muss die Catalog-Permissions-Regeln ebenfalls berücksichtigen, damit gesperrte Produkte nicht über Facetten wie Marke oder Preis indirekt sichtbar werden, obwohl die zugehörige Kategorie für die aktuelle Kundengruppe eigentlich verborgen ist. Der Suchindex filtert dafür auf Basis derselben catalogpermissions_index-Daten, bevor Aggregationen für die Facetten berechnet werden.

Das bedeutet in der Praxis, dass Facetten-Zählungen für unterschiedliche Kundengruppen unterschiedlich ausfallen können, selbst bei identischer Kategorieseite, was bei der Fehlersuche berücksichtigt werden muss: Ein vermeintlich falscher Facetten-Zähler ist häufig kein Bug, sondern korrektes Verhalten für eine andere, eingeloggte Kundengruppe.

6. Verhalten von GraphQL und Storefront-API unter Catalog Permissions

Eine gesperrte Kategorie liefert in der GraphQL-API kein Fehlerobjekt, sondern schlicht keine Produkte beziehungsweise eine leere Kategorie-Response, abhängig vom eingesetzten Bearer-Token beziehungsweise Gastkontext der Anfrage. Das Frontend muss diesen Fall explizit abfangen und darf nicht wie bei einem echten Serverfehler reagieren, sondern sollte eine reguläre, für den jeweiligen Nutzer plausible leere Kategorieseite anzeigen.

Für die Kaufberechtigung greift eine ähnliche Logik im Checkout-Mutation-Resolver: Wird versucht, ein Produkt ohne Kaufberechtigung in den Warenkorb zu legen, liefert die addProductsToCart-Mutation einen expliziten Fehlercode zurück, den das Frontend als Berechtigungsfehler und nicht als generischen Lagerbestandsfehler behandeln sollte.


{
  "errors": [
    {
      "message": "The requested product cannot be added to the cart for this customer group.",
      "extensions": {
        "category": "graphql-input-error",
        "sku": "B2B-WHOLESALE-100"
      }
    }
  ]
}

7. B2B-Praxisbeispiel: freigeschaltete Produktlinie

Ein typisches Szenario: Ein Hersteller verkauft neben dem Endkundensortiment eine separate Fachhandwerker-Produktlinie mit abweichenden Konditionen, die weder für Gäste noch für normale registrierte Kunden sichtbar sein soll. Die Kategorie dieser Produktlinie erhält Verweigern für Sichtbarkeit für alle Standardgruppen, während eine neu angelegte Fachhandwerker-Gruppe, der Kunden erst nach manueller Prüfung im Backend zugewiesen werden, vollen Zugriff erhält.

Ergänzend lässt sich über die Kundengruppen-Zuweisung im Kundenkonto-Editor steuern, dass ein Kunde erst nach Freigabe eines Vertriebsmitarbeiters in die Fachhandwerker-Gruppe wechselt, wodurch die Sichtbarkeit der Produktlinie faktisch an einen manuellen Freigabeprozess gekoppelt ist, ohne dass dafür eigene Entwicklung notwendig wäre.

8. Abgrenzung und Zusammenspiel mit Shared Catalogs im B2B-Modul

Adobe Commerce B2B bringt mit Shared Catalogs ein eigenes, verwandtes Konzept mit, das häufig mit Catalog Permissions verwechselt wird. Ein Shared Catalog steuert vor allem individuelle Preislisten und Sortimentsausschnitte pro Firmenkonto, während Catalog Permissions eine reine Ja-Nein-Sichtbarkeits- und Kaufberechtigungsprüfung pro Kundengruppe ist, unabhängig von firmenspezifischen Preisen.

In der Praxis lassen sich beide Mechanismen kombinieren: Catalog Permissions blendet eine komplette Produktlinie für alle außer der freigeschalteten Kundengruppe aus, während innerhalb dieser Gruppe zusätzlich unterschiedliche Shared Catalogs für einzelne Firmenkonten unterschiedliche Preise und Teilsortimente definieren können. Wer nur firmenspezifische Preise ohne echte Sichtbarkeitssperre benötigt, kommt meist mit Shared Catalogs allein aus und kann auf Catalog Permissions verzichten.

Wichtig für die Architekturentscheidung: Catalog Permissions wirkt auf Kategorie-Ebene und damit auch auf Navigation und Suche, Shared Catalogs wirken auf Produkt- und Preisebene innerhalb eines bereits sichtbaren Katalogs. Wer beide Features gleichzeitig aktiviert, sollte deren Wechselwirkung insbesondere bei der Indexierung sorgfältig testen, da beide Mechanismen eigene Indexer mit eigenem Zeitplan mitbringen.

9. Fallstricke und Monitoring im Produktivbetrieb

Ein häufig übersehener Fallstrick ist ein vergessener Reindex nach einer Bulk-Änderung an Kundengruppen-Zuordnungen, etwa nach einem CSV-Import neuer B2B-Kunden. Bis der catalogpermissions_index läuft, sehen die neu zugeordneten Kunden weiterhin die alten, meist restriktiveren Berechtigungen, was in der Praxis zu Support-Anfragen führt, bevor der Indexer manuell oder per Zeitplan durchläuft.

Wichtig ist außerdem, den zusätzlichen Cache-Overhead frühzeitig in die Kapazitätsplanung für den Full-Page-Cache einzubeziehen, da bei aktivem Catalog Permissions deutlich mehr Cache-Varianten vorgehalten werden müssen als in einem Standard-Setup ohne kundengruppenspezifische Sichtbarkeit.

Berechtigungsachse Werte Wirkung Betrifft Indexer
Sichtbarkeit (view) Erlauben, Verweigern, Übernehmen Kategorie erscheint in Navigation und Suche oder nicht Ja, catalog_permissions
Preisanzeige (price) Erlauben, Verweigern, Übernehmen Preis wird angezeigt oder durch Login-Aufforderung ersetzt Ja, catalog_permissions
Kaufberechtigung (checkout) Erlauben, Verweigern, Übernehmen Produkt kann in den Warenkorb gelegt werden oder nicht Ja, catalog_permissions
Vererbung Von übergeordneter Kategorie Unterkategorien übernehmen die Regel der Elternkategorie Indirekt über Kategoriebaum
Website-Scope Optional pro Website Erlaubt unterschiedliche Regeln je Website im selben Shop Ja, pro Website-ID

Mironsoft

Magento-Entwicklung, Modul-Beratung und Systemarchitektur

Magento-Projekt, das eine zweite Meinung oder erfahrene Umsetzung braucht?

Wir entwickeln individuelle Magento-Module, beraten bei Architekturentscheidungen und übernehmen komplexe Umsetzungen, von der Service-Contract-Planung bis zum produktionsreifen Deployment.

Architektur-Beratung

Modul- und Systemarchitektur vor der Umsetzung fundiert durchdenken lassen.

Custom-Modul-Entwicklung

Individuelle Magento-Module nach Best Practices sauber umsetzen.

Code-Review & Audit

Bestehende Module auf Performance, Sicherheit und Wartbarkeit prüfen lassen.

10. Zusammenfassung

Catalog Permissions

Konzept

Drei getrennte Achsen, Sichtbarkeit, Preisanzeige und Kaufberechtigung, jeweils pro Kundengruppe und Kategorie konfigurierbar.

Indexer

Die Tabelle catalogpermissions_index materialisiert die Berechtigungsmatrix, jede Änderung erfordert einen Reindex.

Performance

Der Full-Page-Cache erhält einen Vary-Wert pro Kundengruppe, was die Zahl der Cache-Varianten spürbar erhöht.

B2B-Einsatz

Freigeschaltete Produktlinien lassen sich über eine dedizierte Kundengruppe ohne Custom-Code abbilden.

11. FAQ: Catalog Permissions

1Ist Catalog Permissions in Magento Open Source verfügbar?
Nein, es ist wie das Product-Recommendations-Modul ausschließlich Teil von Adobe Commerce.
2Welche drei Berechtigungsachsen kennt Catalog Permissions?
Sichtbarkeit im Katalog, Anzeige von Preisen und Berechtigung, ein Produkt tatsächlich in den Warenkorb zu legen, jeweils unabhängig konfigurierbar.
3Was passiert ohne explizite Catalog-Permissions-Regel für eine Kategorie?
Sie gilt standardmäßig für alle Kundengruppen als sichtbar und kauffähig, das Feature muss aktiv für einschränkende Regeln genutzt werden.
4Muss nach einer Berechtigungsänderung manuell reindexiert werden?
Ja, wenn der Indexer nicht auf Echtzeit-Update steht, sonst bleiben für Kunden die alten Berechtigungen wirksam, bis der Indexer läuft.
5Warum erhöht Catalog Permissions die Zahl der Full-Page-Cache-Varianten?
Weil die Kundengruppen-Zugehörigkeit als zusätzlicher Vary-Wert in den Cache-Schlüssel einfließt, wodurch pro Kategorieseite mehrere Cache-Varianten entstehen.
6Beeinflusst Catalog Permissions auch die Facetten-Zählung in der Layered Navigation?
Ja, Facetten werden auf Basis derselben Berechtigungsdaten gefiltert, wodurch Zählungen je nach Kundengruppe unterschiedlich ausfallen können.
7Was liefert die GraphQL-API für eine für die aktuelle Kundengruppe gesperrte Kategorie?
Kein Fehlerobjekt, sondern eine leere Kategorie-Response beziehungsweise keine Produkte, das Frontend muss diesen Fall explizit abfangen.
8Wie lässt sich eine Produktlinie nur für freigeschaltete B2B-Kunden sichtbar machen?
Über eine eigene Kundengruppe mit Erlauben für alle drei Achsen, während Standardgruppen für die betreffende Kategorie Verweigern für Sichtbarkeit erhalten.
9Welchen Fehlercode liefert addProductsToCart bei fehlender Kaufberechtigung?
Einen expliziten Berechtigungsfehler, den das Frontend von einem generischen Lagerbestandsfehler unterscheiden und entsprechend anders behandeln sollte.
10Sollte Catalog Permissions shopweit oder nur gezielt aktiviert werden?
Gezielt nur für tatsächlich einzuschränkende Kategorien, um die Zahl der zusätzlichen Cache-Varianten und den Indexer-Aufwand überschaubar zu halten.