예제 #1
0
        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);
        }
예제 #2
0
        /// <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());
            }
        }
예제 #3
0
        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);
            }
        }