03.08.2006, 16:29 | #1 |
Участник
|
права доступа к отдельным клиентам
Здравствуйте!
Подскажите, как можно спрятать группу организаций (или персон) от определенного пользователя (группы пользователей) ? Понятно, что это можно сделать с помощью представлений, но как можно это сделать с помощью прав доступа? Спасибо!
__________________
тел. 8(916) 411-4006 |
|
04.08.2006, 00:13 | #2 |
Moderator
|
Присвоить этим пользователям роль, для которой право чтения организаций/контактов установлено в "читать только свои".
|
|
|
За это сообщение автора поблагодарили: Paolo (1). |
04.08.2006, 11:44 | #3 |
Microsoft CRM Certified Professional
|
Или используете Business Units (в одном подразделении все видят всё), а в другом подразделении только записи своего подразделения:
Например 2 подразделения: -логистика - 2 пользователя -продажи - 20 пользователей логисты видят контакты во всей организации (т.е. видят контакты поставщиков и клиентов), а продавци только записи в рамках своего подразделения (т.е. видят только контакты клиентов) Последний раз редактировалось mystic; 07.08.2006 в 18:07. |
|
08.08.2006, 10:38 | #4 |
Участник
|
Цитата:
Сообщение от AndreyS
Присвоить этим пользователям роль, для которой право чтения организаций/контактов установлено в "читать только свои".
спасибо! это же элементарно как я сам забыл?
__________________
тел. 8(916) 411-4006 |
|
14.08.2006, 11:59 | #5 |
Участник
|
Следующий вопрос:
допустим, есть 2 группы пользователей, у одной из которых есть "свои клиенты", но при этом, другая группа также работает с частью из этих клиентов, причем, две группы относятся к разным подразделениям и НЕ должны видеть всех клиентов в базе для первой группы ставим - видеть только своих, что ставить для 2-? Нужно ли создавать рабочую группу? Или как это правильно можно сделать?
__________________
тел. 8(916) 411-4006 |
|
14.08.2006, 12:32 | #6 |
Участник
|
Может быть так?
Нужно две роли - каждой роли доступ только для своих клиентов. Потом создаем рабочую группу - (общие клиенты например). В эту группу включаем пользователей которые должны видеть клиентов. Дальше из списка организаций выбираем нужные и нажимаем Другие действия\ Предоставить доступ и указываем рабочую группу. |
|
|
За это сообщение автора поблагодарили: Paolo (1). |
15.08.2006, 09:39 | #7 |
Microsoft CRM Certified Professional
|
Можно сделать видимыми для двух подразделений только организации (действия, продажи, контакты видеть только свои), обычно если проанализировать ситуацию это не несёт опасности.
Далее если человек видет. что ему надо работать с этой организации, он обращается к владельцу организации и он (владелец), представляет права по суенарию описанному sam |
|
23.11.2007, 12:04 | #8 |
Заноза в заднице
|
Пожалуй, подниму тему наверх, поскольку есть проблема...
Значит, у нас есть пользователь, некий Иванов Ваня. Ему присвоена роль, по которой он может смотреть контакты только своего подразделения и в активных контактах у него не числится ни один контакт параллельного департамента (это правильно). Но к одному контакту потребовалось дать доступ. Для этого ответственный за контакт забрался в пункт меню "Предоставить доступ..." соответсвующего контакта и добавил Иванова Ваню в пользователи, пометив одну единственную галку "Чтение". После этого Ваня Иванов увидел в списке активных контактов тот контакт (о чудо!) и кроме того даже смог отредактировать поля этого контакта и успешно сохранить свои изменения (что пипец как неправильно). Собсна я щас пребываю в состоянии культурного шока: как такое может быть, если доступ открыт тока на чтение (я потом спецом открыл и перепроверил)? |
|
26.01.2009, 16:30 | #9 |
Участник
|
Господа, вопрос:
Хочу определить доступ к записи по определенному атрибуту сущности. Думаю сделать так: Создать Определенную роль "Роль1". Написать Плагин на Pre Retrieve message, в котором буду по значению атрибута и наличию у пользователя "Роли1" возвращать/не возвращать данные. Кто-нибудь делал подобное? Дайте ссылки или исходники. В частности нужна помощь в определении наличия права у Пользователя. Последний раз редактировалось Bakai Madybaev; 26.01.2009 в 16:34. |
|
26.01.2009, 18:41 | #10 |
Moderator
|
Есть готовое решение, но оно денег стоит: http://mscrm4ever.blogspot.com/2008/...ty-wizard.html.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
26.01.2009, 21:21 | #11 |
Чайный пьяница
|
Цитата:
Сообщение от Артем Enot Грунин
Есть готовое решение, но оно денег стоит: http://mscrm4ever.blogspot.com/2008/...ty-wizard.html.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
27.01.2009, 08:44 | #12 |
Участник
|
|
|
27.01.2009, 08:52 | #13 |
Moderator
|
Другого пути сделать это я не вижу. Надо отдать должное этим ребятам. Судя по демонстрациям, они сделали кучу классных продуктов, притом большинство из них полностью поддерживаемые.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
27.01.2009, 11:30 | #14 |
Чайный пьяница
|
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
28.01.2009, 10:22 | #15 |
Участник
|
Подскажите, как НЕ вернуть данные из Plugin на Retrieve message?
|
|
28.01.2009, 10:26 | #16 |
Чайный пьяница
|
В методе Execute плагина вызовите исключение. Например InvalidPluginException.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit Последний раз редактировалось a33ik; 28.01.2009 в 10:31. |
|
29.01.2009, 08:20 | #17 |
Участник
|
|
|
29.01.2009, 09:03 | #18 |
Moderator
|
Все верно, исключений быть не должно. Думаю, надо изменять OutputParameters с тем, чтобы они не содержали лишних данных.
Обращаю ваше внимание на тот факт, что пользователи должны иметь возможность сохранять изменения в дозволенных на чтение/изменения полях. А это значит, что если вы просто удалите данные из запроса, то можете получить проблему очистки скрываемых значений при сохранении из формы. Будьте внимательны! С другой стороны, если эти поля скрыты, то они не должны стать isDirty и передаваться на сохранение. Словом одними плагинами и без скриптов вам, видимо, не обойтись!
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
За это сообщение автора поблагодарили: Bakai Madybaev (1). |
29.01.2009, 11:34 | #19 |
Участник
|
Артем, спасибо за информацию.
Пока что сделал так на попытку открытия формы клиента. Но теперь мне надо сделать так, чтобы Запись совсем не отображалась в Представлении и отчете Пользователю без необходимой роли. Насколько я понимаю, для этого мне нужно плагин подключить к RetrieveMultiple message? |
|
29.01.2009, 11:38 | #20 |
Участник
|
X++: public void Execute(IPluginExecutionContext context) { if (context.Depth > 1) return; Microsoft.Crm.Sdk.Moniker entity = null; if (context.InputParameters.Properties.Contains("Target") && context.InputParameters.Properties["Target"] is Microsoft.Crm.Sdk.Moniker) { entity = (Microsoft.Crm.Sdk.Moniker)context.InputParameters.Properties["Target"]; if (entity.Name != Microsoft.Crm.SdkTypeProxy.EntityName.account.ToString()) { return; } } else { return; } ICrmService serv = context.CreateCrmService(true); TargetRetrieveDynamic targetRetrieve = new TargetRetrieveDynamic(); // Set the properties of the target. targetRetrieve.EntityName = entity.Name; targetRetrieve.EntityId = entity.Id; // Create the request object. RetrieveRequest retrieve = new RetrieveRequest(); // Set the properties of the request object. ColumnSet cols = new ColumnSet(); cols.Attributes.Add("customertypecode"); cols.Attributes.Add("name"); retrieve.Target = targetRetrieve; retrieve.ColumnSet = cols; // Indicate that the BusinessEntity should be retrieved as a DynamicEntity. retrieve.ReturnDynamicEntities = true; // Execute the request RetrieveResponse retrieved = (RetrieveResponse)serv.Execute(retrieve); DynamicEntity retrievedentity = (DynamicEntity)retrieved.BusinessEntity; if (retrievedentity.Properties["customertypecode"] != null) { if (((Picklist)retrievedentity.Properties["customertypecode"]).name == "Клиент") { // Create a QueryExpression. QueryExpression qe = new QueryExpression(); qe.EntityName = "role"; qe.ColumnSet = new AllColumns(); // Set up the join between the role entity // and the intersect table systemuserroles. LinkEntity le = new LinkEntity(); le.LinkFromEntityName = "role"; le.LinkFromAttributeName = "roleid"; le.LinkToEntityName = "systemuserroles"; le.LinkToAttributeName = "roleid"; // Set up the join between the intersect table // systemuserroles and the systemuser entity. LinkEntity le2 = new LinkEntity(); le2.LinkFromEntityName = "systemuserroles"; le2.LinkFromAttributeName = "systemuserid"; le2.LinkToEntityName = "systemuser"; le2.LinkToAttributeName = "systemuserid"; // The condition is to find the user ID. //Microsoft.Crm.Sdk.Query.c ConditionExpression ce = new ConditionExpression(); ce.AttributeName = "systemuserid"; ce.Operator = ConditionOperator.Equal; ce.Values = new object[] { context.UserId }; FilterExpression fe = new FilterExpression(); fe.AddCondition(ce); le2.LinkCriteria = fe; le.LinkEntities.Add(le2); qe.LinkEntities.Add(le); // Execute the query. BusinessEntityCollection bec = serv.RetrieveMultiple(qe); string rolename = "Системный администратор"; bool roleFound = false; if (bec.BusinessEntities.Count > 0) { for (int i = 0; i < bec.BusinessEntities.Count; i++) { if (rolename == ((role)bec.BusinessEntities[i]).name) roleFound = true; } } if (!roleFound) { throw new InvalidPluginExecutionException("У вас нет достаточных прав на просмотр данных о клиенте."); } } } } |
|