發表文章

目前顯示的是有「permission set」標籤的文章

把Lookup field轉換成Master-Detail field時,請記得檢查對應的Permission

圖片
Summary  If you have granted user an object permission by Permission Set(eg. Read, Edit, etc), when you convert a lookup field to master-detail field on that object,  the object permission in that Permission Set will be removed automatically if the permission set hasn't grant the Master object permission in advance. 經實驗證實,如果你原本藉由 Permission Set 來授予 user某 object 的權限, 當你把這個 object 上的 lookup field 轉換成 master-detail field 時,原本在 permission set 裡的的這個 object permission 會自動被移除。 除非這個 permission set 原本就有包含 master-detail relationship 裡那個 master object 的權限。 實驗步驟 1. 開一個全新的 permission set ,在其中給予 foo object 的 read 、 edit 權限。並給予對於 foo object 各 field 的 read 、 edit 的 Field - Level Security (FLS)。 2. 把 foo object 裡 lookup 到 bar object 的 field ,轉成 master - detail type 3. 檢視剛剛新開的 permission set ,發現剛給的 object permission 都被清空歸零了。但是FLS都還在。 4. 手動再次把 read 、 edit 等權限勾回來,會發現 permission set 會自動新增 bar object ( master object )的 permission 。(也有可能不會發現,因為他是偷偷自動完成的) 補充說明 雖然Permission Set裡面的 object permission 勾勾...

如何快速用 SOQL 撈出哪些 Profile / Permission Set 有權限對某特定 Object 做 Create/Read/Update/Delete

案例情境 想找出哪些 Profile / Permission Set 有權限在 TSN__c  這個 object create record. 操作步驟 步驟一 SELECT Parent.label, PermissionsCreate,SobjectType  FROM ObjectPermissions  WHERE SobjectType = 'TSN__c' AND PermissionsCreate = true order by Parent.label 補充說明: ParentId這一欄存的為 0PS 開頭的 Id,可以代表對應的 Profile 或 Permission Set。 若對應的是 Permission Set,則SELECT Parent.Label 可以直接顯示出該 Permission Set 的名稱。 若對應的是 Profile,則 Parent.Label 欄位會顯示出該 Profile 的 Id (00e開頭的Id)。 步驟二 拿著步驟一得到的 Profile Id,再去進行二次 Query: SELECT Id, Name  FROM Profile  WHERE Id IN ('00e0B000000FXXXXXX', '00e0B000000FYYYYYY', '00e4T000000MZZZZZZ') 步驟三 (optional) 若需要進一步查看這些 Profile / Permission 下有哪些個體 User,則可再 query User object 或 PermissionSetAssignment object。

為什麼明明在 Profile/Permission Set 開了 delete 的權限,仍然沒有權限刪除 record ?

問題描述 發現某一個 user 在刪某 custom object 的 record 時,會遇到權限不足的錯誤訊息。 在 Profile/Permission 設定,已經把 Create/Read/Update/Delete 的權限全開了。FLS(Field-Level Security)的Read和Edit也全開了。 該 object 的 sharing setting 為  Public Read/Write ,且 Grant Access Using Hierarchies 設為TRUE。 原因 即便是 public read/write 的 object,即便你有 delete 這個 object record 的權限。但你仍然不能 delete 那些不屬於你的 record。 只有這三種情形允許 delete record: Is the record owner. Is higher than the owner in the owner's role hierarchy Has the 'Modify All' permission 如果你不屬於以上三種,但又很需要有 delete record 的權限,勉強有一些 workaround: 做一個 custom button ,靠 Apex Class以 system 身份來 delete record。 把 record 的 owner 設成該 user 或是他的下屬。 補充說明 為什麼都已經把 user 的 UserRole 設成最高層級 CEO 了,還是會遇到權限不足的情況呢? 因為你可能遇到 owned by another CEO 的 record了😆 你只能刪你下屬的,不能刪你平行同事的。 合理。 參考資料 https://salesforce.stackexchange.com/questions/307295/how-to-grant-delete-permissions-to-public-read-write-object-in-salesforce

如何開啟 Task object 的權限? How to enable IsCreatable/ IsEditable /etc. Permission in Permission Set?

圖片
Permission Set Overview>System Permissions Edit Tasks Create, edit, and delete tasks.

快速查詢有哪些 Permission Set 有開啟了某 Apex Class/Visualforce Page 的權限

情境  假設我現有一個 Visualforce Page 叫做 MyVFPage,而有一個 user 打開這一頁會出現權限不足的錯誤頁面。所以我需要開權限給他。 而我已知曾經有某一個 Permission Set 有包含到這個 Visualforce Page Access,所以我理應不需要再重新 create 一個新的 Permission Set,只要找到舊的這個 Permission Set 並 assign 給該 user 即可。 但是我忘記這個既有的 Permission Set 叫什麼名字了…… 目前有數十個上百個 Permission Set,我總不能一個一個點開來檢查確認吧。 有沒有快速的查詢方法呢? 解法 1. 取得該 Visualforce Page的 Id SELECT Id, Name FROM ApexPage WHERE Name = 'MyVFPage' 2. 拿 Visualforce Page 的 Id 再去  SetupEntityAccess query SELECT Id, ParentId, SetupEntityId, SetupEntityType FROM SetupEntityAccess  WHERE SetupEntityId = '<MyVFPage Id>' 此時的 ParentId 即是答案,是包含了該 page access 權限的所有 Permission Set/Profile。 但 Id 不易閱讀理解,可以再做下一步驟取得 Name。 3. 拿 0PS 開頭的 Id 去 PermissionSet query,即可得到名稱。 SELECT Description, Id, Name Profile.name, Type FROM PermissionSet  WHERE  Id IN ('0PSXXXXXXXXXXXXXXX', ' 0PSXXXXXXXXXXXXXXX ', ' 0PSXXXXXXXXXXXXXXX ') 

如何以SOQL撈出資料來比對兩個Permission Set的異同

就這三個關鍵object: PermissionSet PermissionSetAssignment ObjectPermissions 有這三個object名稱,應該就夠自己摸索出來了。 這邊再提供幾個Salesforce官方的範例 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 ) SELECT Id, SObjectType, PermissionsRead, Parent.label, Parent.IsOwnedByProfile FROM ObjectPermissions WHERE (ParentId IN ( SELECT PermissionSetId FROM PermissionSetAssignment WHERE Assignee.Name = 'John Doe' )) AND (PermissionsRead = true ) AND (SobjectType = 'Account' ) 參考資料在此 Using SOQL to Determine Your Force.com User’s Permissions