Salesforce: как визуализировать вершину только в том случае, если текущий пользователь имеет разрешение на обновление текущей записи. Безопасность на уровне записи

Я пытаюсь исправить свой код, опубликованный для этого вопроса VisualForce: преобразование возврата каретки в разрывы строк HTML в длинном текстовом поле

Как вы можете видеть в этой публикации, для страницы Visualforce есть настраиваемый контроллер, содержащий вкладки для Case. Единственный способ перечислить CaseComments - использовать пользовательский Apex. Контроллер выполняет простой запрос, чтобы получить все CaseComments для текущего дела.

Я хочу отображать ссылку «Изменить» только в том случае, если текущий пользователь имеет разрешение на редактирование экземпляра конкретного комментария к делу.

Я нашел здесь хороший блог о динамическом рендеринге компонентов на основе безопасности на уровне объекта: http://forcearchitects.deliveredinnovation.com/2011/02/05/render-visualforce-components-dynamically-based-on-object-level-security/

Основываясь на этой публикации, я попытался использовать

$ObjectType.CaseComment.updateable

Как в следующем:

<apex:repeat value="{!comments}" var="c">
    <tr>
    <td class="commentsActionColumn">
    <!-- open the case comment for edit -->
    <apex:outputLink title=""
        rendered="{!$ObjectType.CaseComment.updateable}" 
    value="/{!c.id}/e?parent_id={!c.parentId}&retURL=/apex/{!$CurrentPage.Name}%3Fid={!case.id}" style="font-weight:bold">Edit</apex:outputLink> 
    </td>
    <td>
    <!-- display the case comment formatted using the apex outputField -->
    <div class="commentTdClass">
    <apex:outputField value="{!c.commentbody}"></apex:outputField>
    </div>
    </td>
    </tr>
</apex:repeat>

К сожалению, тест на возможность обновления находится на уровне объекта, поэтому он возвращает true для всех CaseComment, если текущий пользователь имеет разрешение на редактирование любого CaseComment.

Мне нужна проверка уровня записи, чтобы отображать действие «Изменить» только в том случае, если конкретная строка может быть изменена текущим пользователем.

Любые идеи?

Обновить Перечитывая свой вопрос, я вижу, что он не так ясен, как должен быть.

Когда я перебираю набор CaseComment для данного Case, мне нужно знать, может ли текущий пользователь безопасно редактировать конкретный CaseComment, не видя «у вас нет страницы разрешений». Этот тест должен проводиться на уровне записи CaseComment за CaseComment, потому что в любом конкретном Case будет много CaseComments, все из которых внесены разными пользователями.


person Bryan    schedule 16.06.2011    source источник


Ответы (2)


Вы можете сделать это двумя способами (я думаю).

Если вы хотите пойти чисто программным путем, посмотрите здесь, в котором обсуждается использование объекта совместного использования, чтобы разрешить совместное использование записей с определенными пользователями или группами.

В противном случае, если возможно, вы могли бы использовать управление ролями и иерархией, чтобы организовать это таким образом, чтобы только люди с определенной ролью определенного уровня или выше могли видеть запись и получать к ней доступ?

Павел

Обновлять:

Основываясь на вашем комментарии ниже, я думаю, вы хотите использовать совместное использование вершины. Если вы посмотрите эту полезную вики-страницу разработчика, то увидите, что вы должны получить доступ к общему объекту, чтобы проверьте, есть ли у пользователя запись в этом объекте, чтобы просмотреть конкретный экземпляр записи. Что-то вроде:

MyObject__Share share1 = [Select ParentId, UserOrGroupId, AccessLevel from MyObject__Share where ParentId = :myrecordId And UserOrGroupId = :UserId];
if(share1 != null)
{ code to allow the record to be viewed}
else
{code to deny access}

Я не тестировал и не пробовал это, поэтому вы захотите настроить это, но это должно быть общей идеей.

Павел

person pbattisson    schedule 16.06.2011
comment
Спасибо за ответ. Я, наверное, ввел вас в заблуждение тем, как сформулировал свой вопрос (нормально для меня). Проблема не в уровне объекта, а в разрешениях на уровне записи. Я не хочу создавать правила для публикации всех комментариев к делу. Я просто хочу знать, может ли текущий пользователь безопасно редактировать CaseComment, не видя страницы у вас нет прав доступа. Это делается на основе уровня записи CaseComment за CaseComment, потому что в каждом конкретном случае будет много CaseComment, внесенных разными пользователями. Это понятнее? - person Bryan; 17.06.2011
comment
Обновил ответ, дайте мне знать, если это поможет. Честно говоря, это новая область для меня, но она должна работать. - person pbattisson; 17.06.2011

Взгляните на приведенный ниже URL.

https://developer.salesforce.com/forums/?id=906F00000008w0gIAA

Похоже, мы можем использовать что-то вроде ниже. однако я еще не тестировал.

SELECT RecordId, [HasReadAccess, HasEditAccess, HasAllAccess, MaxAccessLevel] FROM UserRecordAccess
WHERE UserId = [single ID]
AND RecordId = [single ID] 
//or Record IN [list of IDs]
person Rajesh Chennupati    schedule 21.11.2017