2013-05-21 6 views
0

У меня есть CompanyUser и класс продукта
Каждый пользователь может создать x количество продуктов. Я хочу, чтобы каждый пользователь мог просматривать продукты друг друга, но только для редактирования собственного продукта.Как разрешить пользователю редактировать только его предметы в XAF

Я создал роль с именем ProductPeople с разрешением типа для класса Product, который я назначаю для CompanyUsers (у роли есть все разрешения, чтение, запись и т. Д.).
Где бы я определил критерии, которые только userX может редактировать/удалять из своего собственного продукта?

ответ

0

Насколько я понимаю ваш вопрос, вы используете только тип передачи. Чтобы иметь возможность выразить то, что вы хотите, вам придется использовать объекты. Для объекта типа SecuritySystemObjectPermissionsObject вы можете указать критерии, по которым вы можете выразить ограничение относительно «собственного продукта».

+0

Вы совершенно правы. Мне пришлось использовать SecuritySystemObjectPermissionsObject. Добавлен объект целевого типа. Задайте разрешения (Создать, Навигация и т. Д.). Наконец, я добавил разрешение на роль. Тем не менее, я должен был сделать это в коде в файле updater.cs, потому что, когда я это сделал с помощью редактора ролей в веб-интерфейсе, он вообще не работал. Удивительно, но факт – Eminem

2

Вот код для класса обновления. Он создаст разрешения для всех объектов вашей базовой сборки. Для этого вам нужен ограниченный класс baseobject, он должен определить два свойства: CreatedBy, который является TeamMember (потомком SecuritySystemUser) и Restricted, который говорит, что если свойство должно быть специально ограничено. Если вы отметите «Ограниченный» как отмеченный, он должен скрыть объект от всех, кроме пользователя, создавшего его.

Примечание: это касается только сборки. Вы можете добавить еще один цикл для всех ссылочных сборок, включая BaseImp и Base. Я делаю это для сборки KPI в качестве примера.

 private void CreateTeamRole() 
    { 
     SecuritySystemRole Role = ObjectSpace.FindObject<SecuritySystemRole>(new BinaryOperator("Name", "Team")); 
     if (Role != null) 
      return; 
     Role = ObjectSpace.CreateObject<SecuritySystemRole>(); 
     Role.Name = "Team"; 
     Role.CanEditModel = true; 
     Role.SetTypePermissions<SecuritySystemUser>(SecurityOperations.Read, SecuritySystemModifier.Allow); 
     Role.SetTypePermissions<SecuritySystemRole>(SecurityOperations.Read, SecuritySystemModifier.Allow); 
     Role.SetTypePermissions<TeamMember>(SecurityOperations.ReadWriteAccess, SecuritySystemModifier.Allow); 
     Role.SetTypePermissions<TeamMember>(SecurityOperations.Navigate, SecuritySystemModifier.Allow); 
     foreach (var item in System.Reflection.Assembly.GetAssembly(typeof(DevExpress.ExpressApp.Kpi.KpiDefinition)).GetTypes()) 
      if (item.IsSubclassOf(typeof(XPBaseObject))) 
       Role.SetTypePermissions(item, SecurityOperations.FullAccess, SecuritySystemModifier.Allow); 
     Role.SetTypePermissions<XPWeakReference>(SecurityOperations.FullAccess, SecuritySystemModifier.Allow); 
     foreach (var item in System.Reflection.Assembly.GetAssembly(typeof(BaseObject)).GetTypes()) 
     { 
      if (item.IsSubclassOf(typeof(XPBaseObject)) && !item.Equals(typeof(TeamMember))) 
      { 
       if (item.IsSubclassOf(typeof(RestrictedBaseObject))) 
       { 
        Role.SetTypePermissions(item, "Create;Navigate;Delete", SecuritySystemModifier.Allow); 
        Role.AddObjectAccessPermission(item, "!Restricted or [CreatedBy.Oid] = CurrentUserId()", SecurityOperations.ReadWriteAccess); 
       } 
       else 
        Role.SetTypePermissions(item, SecurityOperations.FullAccess, SecuritySystemModifier.Allow); 
      } 
     } 
    } 
Смежные вопросы