Exemplo n.º 1
0
        protected internal override object GetPermissionCategoryKey(long permissionObject, IEnumerable <long> permissions, object entityKey, string entityKeyParameterName)
        {
            object obj = permissionObject;
            var    cat = PermissionCoordinator.GetPermissionCategory((P)obj);

            return(GetPermissionCategoryKey(cat));
        }
        private Dictionary <P, long> GetCategoryAcl(P permission, K?categoryKey)
        {
            var acl = UserAcl();
            var cat = PermissionCoordinator.GetPermissionCategory(permission);

            // In some senarios, we haven't set the categorykey yet. so we shouldn't get exception!
            //   if (cat != null && categoryKey == null)
            //       throw new Exception("The requested permission object[" + typeof(P).ToString() + "] has category[" + cat.Value.ToString() + "], but you passed a null categoryKey! This permission is only valid within an instance of a category.");

            // In some senarios, we pass the categoryKey always (by controller) but it shouldn't be used for permissions with no category. so we comment it and make the related key.
            //if (cat == null && categoryKey != null)//TODO : we can bypass this instead of exception throwing...
            //    throw new Exception("The requested permission object[" + typeof(P).ToString() + "] has no any category, but you passed categoryKey[" + categoryKey.ToString() + "]!");

            if (cat == null)
            {
                categoryKey = null;             //In some senarios, we pass the categoryKey always (by controller) but it shouldn't be used for permissions with no category.
            }
            var key = new UserAclKey <C, K>(cat, categoryKey);

            if (acl.ContainsKey(key))
            {
                return(acl[key]);
            }
            return(null);//مثلا زمانیکه در رسته استان تهران  کلا دسترسی ای برای ایشان تعریف نشده است
        }
        /// <summary>
        /// بدون توجه به رسته اجازه ها، چک می کند که آیا اجازه ای دارد. برای زمانی مناسب است که مثلا می خواهیم یک منو رو فعال یا غیرفعال کنیم ولی رسته ان بعدا مشخص می شود
        /// مثال : آیا اجازه ارسال دستور حداقل در یک استان را دارد؟
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="permissions"></param>
        /// <returns></returns>
        public bool HasAnyCategoryPermission <T>(T permissions) where T : struct
        {
            if (IsEnterpriseAdmin != null && IsEnterpriseAdmin())
            {
                return(true);
            }
            var entityItem = PermissionCoordinator.GetRelatedPermissionItem(typeof(T));

            return(HasAnyCategoryPermission(entityItem, Convert.ToInt64(permissions), null));
        }
Exemplo n.º 4
0
 public bool?HasPermission(P permissionObject, long requestedPermissions /*NOTE:this parameter can be cumulative*/, PermissionLimiterBase permissionLimiter, K?categoryKey = null)
 {
     if (!HttpContext.Current.User.Identity.IsAuthenticated)
     {
         return(false);
     }
     if (categoryKey == null)
     {
         categoryKey = GetPermissionCategoryKey(PermissionCoordinator.GetPermissionCategory(permissionObject));
     }
     return(UserPermissionHelper.HasPermission(permissionObject, requestedPermissions, permissionLimiter, categoryKey));
 }
Exemplo n.º 5
0
        /// <summary>
        /// از ارسال اجازه های ترکیبی به این پارامتر خودداری شود
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="permissions"></param>
        /// <returns></returns>
        public bool HasFullPermissionOf <T>(T permissions, K?categoryKey = null) where T : struct
        {
            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                return(false);
            }
            if (categoryKey == null)
            {
                categoryKey = GetPermissionCategoryKey(PermissionCoordinator.GetPermissionCategory(PermissionCoordinator.GetRelatedPermissionItem(typeof(T))));
            }

            return(UserPermissionHelper.HasFullPermissionOf <T>(permissions, categoryKey));
        }
        /// <summary>
        /// از ارسال اجازه های ترکیبی به این پارامتر خودداری شود
        /// </summary>
        /// <param name="permissionObject"></param>
        /// <param name="requestedPermission"></param>
        /// <returns></returns>
        public bool HasFullPermissionOf(P permissionObject, long requestedPermission, K?categoryKey = null)
        {
            if (IsEnterpriseAdmin != null && IsEnterpriseAdmin())
            {
                return(true);
            }
            var acl = GetCategoryAcl(permissionObject, categoryKey);

            if (acl != null && acl.ContainsKey(permissionObject))
            {
                long userPermissions = acl[permissionObject];
                return(!PermissionCoordinator.HasOnlySubPermission(permissionObject, requestedPermission, userPermissions));
            }
            return(false);
        }
Exemplo n.º 7
0
        /// <summary>
        /// از ارسال اجازه های ترکیبی به این پارامتر خودداری شود
        /// </summary>
        /// <param name="permissionObject"></param>
        /// <param name="requestedPermissions"></param>
        /// <returns></returns>
        public bool HasFullPermissionOf(P permissionObject, long requestedPermissions)
        {
            if (IsEnterpriseAdmin != null && IsEnterpriseAdmin())
            {
                return(true);
            }
            var acl = UserAcl();

            if (acl.ContainsKey(permissionObject))
            {
                long userPermissions = acl[permissionObject];
                return(!PermissionCoordinator.IsLimitedPermission(permissionObject, requestedPermissions, userPermissions));
            }
            return(false);
        }
Exemplo n.º 8
0
        public bool?HasPermission(P permissionObject, long requestedPermissions /*NOTE:this parameter can be cumulative: OR base not AND base*/, PermissionLimiterBase permissionLimiter = null)
        {
            if (IsEnterpriseAdmin != null && IsEnterpriseAdmin())
            {
                return(true);
            }

            var acl = UserAcl();

            if (acl.ContainsKey(permissionObject))
            {
                //NOTE : اجازه درخواستی نمی بایست "فول" را داشته باشد. البته "اور" شده ها را می تواند داشته باشد
                //       در واقع هیچگاه "فول" ها که فقط در دیتابیس معنی دارند نمی بایست بطور مجزا در "ریکوستت پرمیشن" حاضر شوند
                //       لذا ممکن است که در اجازه های کاربر یک "فول" وجود داشته باشد اما هرگز در "اجازه های موردنیاز" یک "فول" بطور تنها نیست و "محدود شده" های آن را نیز شامل می شود
                long userPermissions      = acl[permissionObject];
                long availablePermissions = userPermissions & (long)requestedPermissions;
                bool result = availablePermissions != 0;

                if (result &&
                    permissionLimiter != null &&
                    PermissionCoordinator.IsLimitedPermission(permissionObject, requestedPermissions, userPermissions)) // برای اجازه های فول فراخوانی توابع محدود شده بی معنی است و اصلا نباید این توابع صدا زده شوند. بطور پیش فرض هم تمامی اجازه ها فول هستند مگر آنکه قبلا تعریف شده باشند
                {
                    // در صورتیکه اجازه موردنیاز با دسترسی کاربر تطابق داشت و تطبیق آن با شرایط اجرای تابع همخوانی داشت آنگاه تابع را فراخوانی کن
                    // توجه : خالی بودن "limitterPermission" خطرناک است و وضعیت را مبهم میکند
                    if (permissionLimiter.LimiterPermission != null)//در صورتیکه تابع محدود شده مخصوص اجازه های خاصی بود
                    {
                        availablePermissions = availablePermissions & permissionLimiter.LimiterPermission.Value;
                    }

                    result = availablePermissions != 0;
                    if (result == false)
                    {
                        return(null);
                    }

                    return(permissionLimiter.LimiterFunction());
                }
                return(result);
            }

            return(false);
        }
Exemplo n.º 9
0
        /// <summary>
        /// در استفاده از این متد دقت کنید. این متد فقط در صورتی که کاربر جاری اجازه کامل داشته باشد و یا بصورت انحصاری خود کاربر ایجاد کننده آن باشد
        /// استفاده صحیحی دارد.
        /// در صورتی که کاربر جاری اجازه خود را از دسترسی دیگری(مثلا از اجازه قلمرو) دریافت کند این متد مقدار "فالس" بر می گرداند
        /// که صحیح نیست. پس لازم است متد کاملتری نوشته شود
        /// </summary>
        /// <param name="permissionObject"></param>
        /// <param name="requestedPermissions"></param>
        /// <param name="itemCreatorUserName"></param>
        /// <returns></returns>
        public bool?HasPermission(P permissionObject, long requestedPermissions /*NOTE:this parameter can be cumulative*/, string itemCreatorUserName = null, K?categoryKey = null)
        {
            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                return(false);
            }
            PermissionLimiterBase <P, C, PC> permissionLimiter = null;

            if (itemCreatorUserName == null)
            {
                return(HasPermission(permissionObject, requestedPermissions, permissionLimiter, categoryKey));
            }

            permissionLimiter =
                new PL()
                .On(PermissionCoordinator.GetAllOwnRelatedPermissions(permissionObject))
                .Except(() => this.UserName == itemCreatorUserName);


            return(HasPermission(permissionObject, requestedPermissions, permissionLimiter, categoryKey));
        }
Exemplo n.º 10
0
        private bool?HasPermissionInAcl(P permissionObject, long requestedPermissions, PermissionLimiterBase permissionLimiter, Dictionary <P, long> acl)
        {
            if (acl == null)
            {
                return(false);            //سطوح دسترسی برای موضوع مورد نظر تعریف نشده است
            }
            if (acl.ContainsKey(permissionObject))
            {
                //NOTE : اجازه درخواستی نمی بایست "فول" را داشته باشد. البته "اور" شده جزیی ها را می تواند داشته باشد
                //       در واقع هیچگاه "فول" ها که فقط در دیتابیس معنی دارند نمی بایست بطور مجزا در "ریکوستت پرمیشن" حاضر شوند
                //       لذا ممکن است که در اجازه های کاربر(یا همان "یوزر پرمیشن") یک "فول" وجود داشته باشد اما هرگز در "اجازه های موردنیاز" یک "فول" بطور تنها نیست و "جزیی" های آن را نیز شامل می شود
                long userPermissions      = acl[permissionObject];
                long availablePermissions = userPermissions & (long)requestedPermissions;
                bool result = availablePermissions != 0;

                if (result &&
                    permissionLimiter != null &&
                    PermissionCoordinator.HasOnlySubPermission(permissionObject, requestedPermissions, userPermissions)) // برای اجازه های کامل فراخوانی توابع محدود شده بی معنی است و اصلا نباید این توابع صدا زده شوند. بطور پیش فرض هم تمامی اجازه ها فول هستند مگر آنکه قبلا تعریف شده باشند
                {
                    // در صورتیکه اجازه موردنیاز با دسترسی کاربر تطابق داشت و تطبیق آن با شرایط اجرای تابع همخوانی داشت آنگاه تابع را فراخوانی کن
                    // توجه : خالی بودن "limitterPermission" خطرناک است و وضعیت را مبهم میکند
                    if (permissionLimiter.LimiterPermission != null)//در صورتیکه تابع محدود شده مخصوص اجازه های خاصی بود
                    {
                        availablePermissions = availablePermissions & permissionLimiter.LimiterPermission.Value;
                    }

                    result = availablePermissions != 0;
                    if (result == false)
                    {
                        return(null);
                    }

                    return(permissionLimiter.LimiterFunction());
                }
                return(result);
            }

            return(false);
        }
Exemplo n.º 11
0
        /// <summary>
        /// مقدار بازگشتی نال به معنی این است که بر روی همه موجودیت ها اجازه دارد. این موضوع تنها برای مدیر ارشد معنا دارد
        /// برای سایرین لیست خالی یا لیست با مقدار بازگردانده می شود
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="permissions"></param>
        /// <returns></returns>
        public List <K?> GetAllowedObjects <T>(T permissions) where T : struct
        {
            if (IsEnterpriseAdmin != null && IsEnterpriseAdmin())
            {
                return(null);
            }
            var entityItem = PermissionCoordinator.GetRelatedPermissionItem(typeof(T));
            var acls       = UserAcl();
            var cat        = PermissionCoordinator.GetPermissionCategory(entityItem);
            var lst        = new List <K?>();

            foreach (var aclItem in acls)
            {
                if (aclItem.Key.Category.Equals(cat))
                {
                    if (HasPermissionInAcl(entityItem, Convert.ToInt64(permissions), null, aclItem.Value) == true)
                    {
                        lst.Add(aclItem.Key.CategoryKey);
                    }
                }
            }
            return(lst);
        }
Exemplo n.º 12
0
        public bool HasPermission <T>(T permissions, string itemCreatorUserName = null, K?categoryKey = null) where T : struct
        {
            var entityItem = PermissionCoordinator.GetRelatedPermissionItem(typeof(T));

            return(HasPermission(entityItem, Convert.ToInt64(permissions), itemCreatorUserName, categoryKey) == true);
        }
Exemplo n.º 13
0
        public bool HasPermission <T>(T permissions, K?categoryKey = null) where T : struct
        {
            var entityItem = PermissionCoordinator.GetRelatedPermissionItem(typeof(T));

            return(HasPermission(entityItem, Convert.ToInt64(permissions), categoryKey: categoryKey) ?? false);
        }
Exemplo n.º 14
0
        public bool HasFullPermissionOf <T>(T permissions) where T : struct
        {
            var entityItem = PermissionCoordinator.GetRelatedPermissionItem(typeof(T));

            return(HasFullPermissionOf(entityItem, Convert.ToInt64(permissions)));
        }