2012-05-09 31 views
9

Theo yêu cầu, tôi phải thay đổi chủ sở hữu của tài khoản nếu người dùng không có quyền truy cập đọc vào đối tượng thứ ba.Làm cách nào để kiểm tra quyền CRUD của người dùng đối với một đối tượng trong Salesforce?

Tôi cần một chức năng tương tự như phương pháp isAccessible() Mô tả kết quả trường, nhưng nó chỉ khả dụng cho người dùng đã đăng nhập hiện tại.

Có cách nào khác để kiểm tra quyền CRUD của người dùng đối với một đối tượng trong mã Apex không?

+1

Bạn đã bao giờ tìm thấy một giải pháp cho điều này? – turbo2oh

Trả lời

0

Từ tài liệu. có vẻ như bạn muốn sử dụng ẩn danh.

Apex thường chạy trong ngữ cảnh hệ thống; nghĩa là các quyền của người dùng hiện tại, các bảo mật cấp trường và các quy tắc chia sẻ không được tính đến trong quá trình thực thi mã, ngoại lệ duy nhất cho quy tắc này là mã Apex được thực hiện bằng lệnh gọi executeAnonymous. executeAnonymous luôn thực hiện bằng cách sử dụng quyền đầy đủ của người dùng hiện tại. Để biết thêm thông tin về executeAnonymous, xem Khối ẩn danh.

Mặc dù Apex không thực thi quyền cấp đối tượng và cấp trường theo mặc định, bạn có thể thực thi các quyền này trong mã của mình bằng cách gọi rõ ràng phương thức mô tả kết quả (của Schema.DescribeSObjectResult) và trường mô tả phương thức kết quả (của Schema.DescribeFieldResult) để kiểm tra mức cấp quyền truy cập của người dùng hiện tại. Bằng cách này, bạn có thể xác minh xem người dùng hiện tại có các quyền cần thiết hay không và chỉ khi người đó có đủ quyền, bạn có thể thực hiện một hoạt động DML cụ thể hoặc một truy vấn.

Ví dụ: bạn có thể gọi phương thức isAccessible, isCreateable hoặc isUpdateable của Schema.DescribeSObjectResult để xác minh xem người dùng hiện tại đã đọc, tạo hoặc cập nhật quyền truy cập vào một sObject, tương ứng. Tương tự, Schema.DescribeFieldResult cho thấy các phương thức kiểm soát truy cập mà bạn có thể gọi để kiểm tra quyền truy cập đọc, tạo hoặc cập nhật của người dùng hiện tại cho một trường. Ngoài ra, bạn có thể gọi phương thức isDeletable được cung cấp bởi Schema.DescribeSObjectResult để kiểm tra xem người dùng hiện tại có quyền xóa một sObject cụ thể không.

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

+0

Vấn đề của tôi là như thế này. Tôi có hai đối tượng A và B. Nếu chủ sở hữu bản ghi A không có quyền truy cập đọc vào đối tượng B, thì hãy thay đổi chủ sở hữu thành một số người dùng được xác định trước. Các phương thức của Schema.DescribeSObjectResult chỉ cho biết người dùng hiện tại có quyền truy cập vào sObject hay không. Tôi muốn một cái gì đó giống như phương pháp isAccessible nhưng hiển thị truy cập cho người dùng khác với người dùng hiện tại. – ntnng

0

Các bạn đã thử phương pháp ?

Giống như (không xác minh):

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

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

Cảm ơn bạn đã trả lời. Phương pháp runas chỉ có thể được sử dụng trong một phương pháp thử nghiệm. Tôi cần kiểm tra quyền truy cập của người dùng trong một lớp học. – ntnng

5

tôi đã viết một bài báo về vấn đề này trên blog của tôi. Có một tính năng vừa được phát hành trong phiên bản 24.0 của API (Spring Release) sẽ cho phép bạn thực hiện việc này trên một bản ghi theo cơ sở kỷ lục cho người dùng hiện tại.

Dưới đây là liên kết với blog entry mà đi vào chi tiết: How to tell if a user has access to a record

2

Đừng nhầm lẫn kỷ lục truy cập ở mức với CRUD - sau này là khả năng cho phép người dùng Tạo, đọc, Cập nhật hoặc Xóa một đối tượng nói chung, bất kể quy tắc chia sẻ, v.v. có thể ảnh hưởng đến quyền truy cập của người dùng vào một bản ghi cụ thể.

Để kiểm tra xem người dùng có thể tạo (ví dụ:Liên hệ) nói chung, chỉ cần sử dụng

Schema.sObjectType.Contact.isCreateable() 

(trả true hoặc false)

0

Lớp DescribeSObjectResult có phương pháp để kiểm tra CRUD.

Ví dụ: điều này cho phép bạn kiểm tra xem người dùng hiện tại có thể cập nhật đối tượng tài khoản nói chung hay không.

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

@ John De Santiago: Bài viết của bạn bao gồm truy cập mức kỷ lục hơn là đối tượng CRUD (= truy cập ở mức đối tượng)

Các vấn đề liên quan