Salesforce Berechtigungen über SOQL bestimmen

Viele Administratoren kennen das Problem: Ist eine Salesforce Organisation historisch gewachsen, fehlt irgendwann nicht nur ein übergreifendes Berechtigungskonzept, sondern es herrscht auch Unsicherheit über bisher vergebene Berechtigungen. Das kann schnell zu einem gravierenden Problem im Bereich Compliance und Fehleranalyse werden.

Problemstellung

Möchte man einem User beispielsweise die Berechtigungen für ein bestimmtes Objekt entziehen, nehmen viele Administratoren den langen Weg auf sich, sämtliche zugewiesenen Permission Sets händisch zu durchsuchen. Noch schwieriger wird es, wenn sich die folgende Fragestellungen stellt: 

Welche Profile oder Permission Sets vergeben Rechte für ein bestimmtes Objekt?

Spätestens hier ist der Umweg über eine manuelle Suche im System kaum mehr umsetzbar. Glücklicherweise liefert uns die hinter Salesforce stehende Datenbank die Möglichkeit, solche Fragen mit wenigen Klicks zu beantworten. 

Lösungsansatz

Salesforce behandelt Berechtigungen intern als eigenständige Datensätze, welche mit Profilen verknüpft sind (die wiederum mit Usern verknüpft sind). Diese Datensätze lassen sich über die Salesforce-eigene Datenbanksprache SOQL abfragen:

SELECT Id, IsOwnedByProfile, Label
FROM PermissionSet

Über das Feld IsOwnedByProfile können wir sofort sehen, ob es sich um eigenständige oder durch ein Profil vergebene Berechtigungssätze handelt:

SELECT Id, IsOwnedByProfile, Label
FROM PermissionSet
WHERE IsOwnedByProfile = TRUE

Mithilfe dieses Mittels können wir nun auch beispielhalft die folgende Fragen beantworten:

„Welche Nutzer haben Schreibzugriff auf Accounts? Und woher stammt diese Berechtigung?“

SELECT Assignee.Name, PermissionSet.Id, PermissionSet.IsOwnedByProfile, PermissionSet.Profile.Name, PermissionSet.Label
FROM PermissionSetAssignment
WHERE PermissionSetId
IN (SELECT ParentId
FROM ObjectPermissions
WHERE SObjectType = 'Account' AND
PermissionsRead = TRUE )

Auch komplexere Fragen lassen sich so leicht beantworten:

„Welche Felder auf Account kann Christian Blechert sehen und welche kann er verändern? Woher stammen diese Berechtigungen?“

SELECT Id, Field, SObjectType, PermissionsRead, PermissionsEdit, Parent.Label, Parent.IsOwnedByProfile
FROM FieldPermissions
WHERE (ParentId IN (
  SELECT PermissionSetId
  FROM PermissionSetAssignment
  WHERE Assignee.Name = 'Christian Blechert'))
AND (PermissionsRead = TRUE)
AND (SObjectType = 'Account')

Wie im einleitenden Absatz angemerkt, lässt sich die Fragestellung auch umkehren.

„Wie kann ich herausfinden, welche Profile Berechtigungen für ein spezifisches Objekt vergeben?“

SELECT Profile.Name FROM PermissionSet
WHERE IsOwnedByProfile = TRUE
AND Id IN (
  SELECT ParentId FROM ObjectPermissions
  WHERE PermissionsRead = TRUE
  AND SObjectType = 'Account'
)

Führen wir diese Anfrage in Salesforce – beispielsweise über die Workbench – aus, erhalten wir eine Auflistung aller Profile mit Zugriff auf das Standardobjekt Account:

results-2

Zusammenfassung

Das Zusammenspiel der klassischen Salesforce-Oberfläche, der dahinterliegenden Datenbank und von SOQL-Abfragen eröffnet viele Möglichkeiten, Datensätze und Informationen schnell anzuzeigen und gegebenenfalls zu verändern.

 

Erkennen Sie Hürden aus Ihrem Salesforce wieder oder wünschen eine detaillierte Aufarbeitung Ihres Berechtigungskonzepts? Wir unterstützen Sie gerne, melden Sie sich bei uns.

Christian Blechert

Mein Name ist Christian Blechert und ich bin zertifizierter Salesforce Consultant und Gründer der graevert UG.