2012-05-09 7 views
9

Gemäß einer Anforderung muss ich den Besitzer eines Kontos ändern, wenn der Benutzer keinen Lesezugriff auf ein drittes Objekt hat.Wie überprüfen Sie die CRUD-Berechtigungen des Benutzers für ein Objekt in Salesforce?

Ich brauche eine ähnliche Funktionalität wie die isAccessible() Methode von Describe Field Result, aber es ist nur für den aktuell angemeldeten Benutzer verfügbar.

Gibt es eine andere Möglichkeit, die CRUD-Berechtigungen des Benutzers für ein Objekt im Apex-Code zu überprüfen?

+1

Haben Sie jemals eine Lösung für diese finden? – turbo2oh

Antwort

0

Aus der Dokumentation. Es klingt, als ob Sie anonym ausführen möchten.

Apex läuft im Allgemeinen im Systemkontext; Das bedeutet, dass die Berechtigungen des aktuellen Benutzers, die Sicherheit auf Feldebene und die Freigaberegeln bei der Codeausführung nicht berücksichtigt werden Die einzigen Ausnahmen von dieser Regel sind Apex-Code, der mit dem Aufruf executeAnonymous ausgeführt wird. executeAnonymous wird immer mit den vollständigen Berechtigungen des aktuellen Benutzers ausgeführt. Weitere Informationen zu executeAnonymous finden Sie unter Anonyme Blöcke.

Obwohl Apex standardmäßig keine Berechtigungen auf Objektebene und Feldebene erzwingt, können Sie diese Berechtigungen in Ihrem Code erzwingen, indem Sie explizit die Ergebnismethoden sObject describe (von Schema.DescribeSObjectResult) und field excellence resin von Schema.DescribeFieldResult), die die Zugriffsberechtigungsstufen des aktuellen Benutzers überprüfen. Auf diese Weise können Sie überprüfen, ob der aktuelle Benutzer über die erforderlichen Berechtigungen verfügt, und nur wenn er über ausreichende Berechtigungen verfügt, können Sie eine bestimmte DML-Operation oder eine Abfrage ausführen.

Zum Beispiel können Sie die Methoden isAccessible, isCreateable oder isUpdateable von Schema.DescribeSbjectResult aufrufen, um zu überprüfen, ob der aktuelle Benutzer den Zugriff auf ein sObject gelesen, erstellt oder aktualisiert hat. In ähnlicher Weise macht Schema.DescribeFieldResult diese Zugriffssteuerungsmethoden verfügbar, die Sie aufrufen können, um den Lese-, Erstellungs- oder Aktualisierungszugriff des aktuellen Benutzers für ein Feld zu überprüfen. Darüber hinaus können Sie die von Schema.DescribeSbjectResult bereitgestellte Methode isDeletable aufrufen, um zu überprüfen, ob der aktuelle Benutzer berechtigt ist, ein bestimmtes sObject zu löschen.

http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#StartTopic=Content/apex_classes_perms_enforcing.htm#kanchor431

+0

Mein Problem ist so. Ich habe zwei Objekte A und B. Wenn der Besitzer von A-Datensatz keinen Lesezugriff auf B-Objekt hat, ändern Sie den Besitzer zu einem vordefinierten Benutzer. Die Methoden von Schema.DescribeSbjectResult zeigen nur an, ob der aktuelle Benutzer Zugriff auf das sObject hat. Ich wollte etwas wie die isAccessible-Methode, aber zeige den Zugriff für den Benutzer anders als den aktuellen Benutzer. – ntnng

0

Haben Sie die Methode versucht?

So etwas (nicht überprüft):

User u = [SELECT Id FROM User WHERE Name='John Doe']; 

System.runAs(u) { 
    if (Schema.sObjectType.Contact.fields.Email.isAccessible()) { 
    // do something 
    } 
} 
+2

Danke für die Antwort. Die runas-Methode kann nur in einer Testmethode verwendet werden. Ich muss den Benutzerzugriff in einer Klasse überprüfen. – ntnng

5

Ich schrieb einen Artikel über diese auf meinem Blog. Es gibt eine Funktion, die gerade in der Version 24.0 der API (Spring Release) veröffentlicht wurde, mit der Sie dies für jeden Benutzer auf Rekordbasis tun können. Hier

ist der Link zu diesem Blog-Eintrag, der in die Details geht: How to tell if a user has access to a record

2

Verwechseln Sie nicht Rekordniveau Zugang mit CRUD - letzteres ist die Fähigkeit für einen Benutzer erstellen , lesen, Aktualisieren Sie oder Löschen Sie ein Objekt im Allgemeinen, unabhängig von Freigaberegeln usw., die den Zugriff des Benutzers auf einen bestimmten Datensatz beeinträchtigen können.

Um zu überprüfen, ob ein Benutzer erstellen kann (z.Kontakte) in der Regel verwenden nur

Schema.sObjectType.Contact.isCreateable() 

(kehrt true oder false)

0

Die DescribeSObjectResult Klasse verfügt über Methoden für CRUD überprüfen.

z. Dadurch können Sie testen, ob der aktuelle Benutzer das Kontoobjekt allgemein aktualisieren kann.

Schema.DescribeSObjectResult drSObj = Schema.sObjectType.Account; 
Boolean thisUserMayUpdate = drSObj.isUpdateable(); 

@John De Santiago: Ihr Artikel umfasst den Zugang Rekordniveau eher als Objekt CRUD (= Objektebene Zugriff)