2012-05-09 28 views
9

Según un requisito, tengo que cambiar el propietario de una cuenta si el usuario no tiene acceso de lectura a un tercer objeto.¿Cómo comprobar los permisos CRUD del usuario para un objeto en Salesforce?

Necesito una funcionalidad similar al método isAccessible() de Describir el resultado del campo, pero solo está disponible para el usuario que ha iniciado sesión actualmente.

¿Hay alguna otra manera de verificar los permisos CRUD del usuario para un objeto en código Apex?

+1

¿Alguna vez encontrar una solución a esto? – turbo2oh

Respuesta

0

De la documentación. Parece que quieres usar ejecutar anónimamente.

Apex generalmente se ejecuta en el contexto del sistema; es decir, los permisos actuales del usuario, la seguridad a nivel de campo y las reglas de uso compartido no se tienen en cuenta durante la ejecución del código. Las únicas excepciones a esta regla son el código Apex que se ejecuta con la llamada executeAnonymous. executeAnonymous siempre se ejecuta con todos los permisos del usuario actual. Para obtener más información sobre executeAnonymous, vea Bloques anónimos.

Aunque Apex no impone permisos de nivel de objeto y de campo de forma predeterminada, puede aplicar estos permisos en su código llamando explícitamente a los métodos de resultado de descripción de sObject (de Schema.DescribeSObjectResult) y el campo describe los métodos de resultado (de Schema.DescribeFieldResult) que verifican los niveles de permiso de acceso del usuario actual. De esta forma, puede verificar si el usuario actual tiene los permisos necesarios, y solo si tiene suficientes permisos, puede realizar una operación DML específica o una consulta.

Por ejemplo, puede llamar a los métodos isAccessible, isCreateable o isUpdateable de Schema.DescribeSObjectResult para verificar si el usuario actual ha leído, creado o actualizado el acceso a un sObject, respectivamente. De forma similar, Schema.DescribeFieldResult expone estos métodos de control de acceso a los que puede llamar para verificar el acceso de lectura, creación o actualización actual del usuario para un campo. Además, puede llamar al método isDeletable proporcionado por Schema.DescribeSObjectResult para verificar si el usuario actual tiene permiso para eliminar un sObject específico.

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

+0

Mi problema es así. Tengo dos objetos A y B. Si el propietario del registro A no tiene acceso de lectura al objeto B, entonces cambie el propietario a un usuario predefinido. Los métodos de Schema.DescribeSObjectResult solo muestran si el usuario actual tiene acceso al sObject. Quería algo así como el método isAccessible pero mostrando el acceso para el usuario que no sea el usuario actual. – ntnng

0

Ha intentado el método ?

Algo similar (no verificado):

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

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

Gracias por la respuesta. El método runas solo se puede usar en un método de prueba. Necesito verificar el acceso del usuario en una clase. – ntnng

5

me escribió un artículo sobre esto en mi blog. Hay una característica que acaba de lanzarse en la versión 24.0 de la API (Spring Release) que le permitirá hacer esto de manera individual para cada registro.

Aquí está el enlace a la entrada de blog que entra en detalles: How to tell if a user has access to a record

2

No se debe confundir registro de acceso al nivel de CRUD - el segundo es la capacidad para que un usuario Crear, Leer, Actualice o Elimine un objeto en general, independientemente de las reglas de uso compartido, etc. que puedan afectar el acceso del usuario a un registro en particular.

Para comprobar si un usuario puede crear (p.Contactos) en general, sólo tiene que utilizar

Schema.sObjectType.Contact.isCreateable() 

(devuelve true o false)

0

La clase DescribeSObjectResult tiene métodos para el control de CRUD.

E.g. esto le permite probar si el usuario actual puede o no actualizar el objeto de la cuenta en general.

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

@ John De Santiago: su artículo cubre acceso a nivel de registro en lugar de CRUD objeto (= acceso a nivel de objeto)

Cuestiones relacionadas