protected XObjectRightsDescr createObjectRightsDescr(XObjectRights rights) { XObjectRightsDescr rightsDescr = new XObjectRightsDescr(); rightsDescr.DenyDelete = !rights.AllowDelete; rightsDescr.DenyChange = !rights.AllowParticalOrFullChange; ICollection readOnlyPropNames = rights.GetReadOnlyPropNames(); rightsDescr.ReadOnlyProps = new string[readOnlyPropNames.Count]; readOnlyPropNames.CopyTo(rightsDescr.ReadOnlyProps, 0); return(rightsDescr); }
/// <summary> /// Метод записи прав на существующий объект в параметр "ObjectRights" объекта-пункта меню /// </summary> /// <param name="menuitem">объект - пункт меню</param> /// <param name="rights">права на существующий объект</param> public static void Write(XMenuActionItem menuitem, XObjectRights rights) { StringBuilder bld = new StringBuilder(); //права на удаление if (!rights.AllowDelete) { bld.Append(".deny-delete:1;"); } //права на изменение свойств if (!rights.AllowParticalOrFullChange) { bld.Append(".deny-change:1;"); } //если есть свойства,доступные только для чтения - также записываем их else if (rights.HasReadOnlyProps) { writeReadOnlyProps(bld, rights.GetReadOnlyPropNames()); } if (bld.Length > 0) { menuitem.Parameters.Add("ObjectRights", bld.ToString()); } }
public const string ATTR_CHANGE_RIGHT = "change-right"; // атрибут объекта - запрещено изменять весь объект public static void ProcessObject(DomainObjectData xobj, XmlElement xmlObject) { if (xobj == null) { throw new ArgumentNullException("xobj", "Не задано типизированное представление объекта"); } if (xmlObject == null) { throw new ArgumentNullException("xmlObject"); } if (xobj.Context == null) { throw new ArgumentException("Экземпляр DomainObjectData должен находиться в контексте (DomainObjectDataSet)"); } XmlElement xmlProp; // получим права текущего пользователя приложения на загруженный объект XObjectRights rights = XSecurityManager.Instance.GetObjectRights(xobj); if (!rights.AllowParticalOrFullRead) { throw new XSecurityException("Чтение объекта " + xobj.ObjectType + "[" + xobj.ObjectID.ToString() + "] запрещено"); } // право на удаление объекта xmlObject.SetAttribute(ATTR_DELETE_RIGHT, rights.AllowDelete ? "1" : "0"); // если объект запрещено изменять (хотя бы одно свойство) - поменям атрибутом xmlObject.SetAttribute(ATTR_CHANGE_RIGHT, rights.AllowParticalOrFullChange ? "1" : "0"); if (rights.AllowParticalOrFullChange && rights.HasReadOnlyProps) { // можно изменять объект, но есть read-only свойства foreach (string sProp in rights.GetReadOnlyPropNames()) { xmlProp = (XmlElement)xmlObject.SelectSingleNode(sProp); /* Убрано за ненадобностью * if (xmlProp == null) * throw new ApplicationException("Подсистема ограничения доступа вернула в описании прав на объект " + xmlObject.LocalName + " read-only свойство, которое отсутствует в xml-объекте: " + sProp); */ if (xmlProp != null) { xmlProp.SetAttribute(ATTR_READONLY, "1"); } } } if (rights.HasHiddenProps) { foreach (string sProp in rights.GetHiddenPropNames()) { xmlProp = (XmlElement)xmlObject.SelectSingleNode(sProp); if (xmlProp != null) { xmlObject.RemoveChild(xmlProp); } } } // по всем объектам-значениям в прогруженных свойствах foreach (XmlElement xmlObjectValue in xmlObject.SelectNodes("*/*[*]")) { DomainObjectData xobjValue = xobj.Context.Find(xmlObjectValue.LocalName, new Guid(xmlObjectValue.GetAttribute("oid"))); if (xobjValue == null) { throw new ApplicationException("Не удалось найти в контексте типизированного объекта DomainObjectData для xml-объекта-значения свойства " + xmlObjectValue.ParentNode.LocalName + " объекта " + xmlObject.LocalName); } ProcessObject(xobjValue, xmlObjectValue); } }