Dank für die Antwort.
Die SQL-Tabelle zu 1 sollte so aussehen:
CREATE TABLE api_access (
`ID` INT(11) NOT NULL,
`customers_id` INT(11) NOT NULL,
`function_id` INT(11) NOT NULL,
`allowed` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(1, 1, 100, 1);
INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(2, 1, 101, 1);
INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(3, 1, 103, 0);
INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(4, 4, 101, 1);
INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(5, 4, 102, 1);
INSERT INTO api_access (ID, customers_id, function_id, allowed) VALUES(6, 4, 103, 1);
ALTER TABLE api_access
ADD PRIMARY KEY (`ID`);
ALTER TABLE api_access
MODIFY `ID` INT(11) NOT NULL AUTO_INCREMENT;
Mit
SELECT `allowed` FROM `api_access` WHERE `customers_id` = 1 AND `function_id` = 102
wird die Berechtigung geprüft.
=> Zeilenzahl der Tabelle ergibt sich aus Anzahl User x Anzahl Funktionen
Allerdings läßt sich die Tabelle sehr gut indizieren.
Das "Zugriffs-Array" in der Session zu speichern ist verlockend, aber leider unsicher und Sessions über Webservices (ist auch ein Teil der Aufgabenstellung) schwer zu realisieren.
Das Array hätte dann den Vorteil, wenn man in einem Script mehrere zugriffsbeschränkte Funktionen aufruft, nur einmal einen Anfragen an den SQL-Server zu senden.