/// <summary> /// Возврашает список пермишенов пользователя /// </summary> /// <returns></returns> public HashSet <string> GetPermissionList(Account user, TypeUsers accessType) { var type = (sbyte)accessType; var key = $"permission{user.Id}"; var permissionList = HttpContext.Cache.Get(key) as HashSet <string>; // если есть в кеше - возвращаем из кеша if (permissionList != null) { // в первой строке лежит время создания кеша var dateHash = DateTime.Parse(permissionList.First()); // если права пользователя не менялись с момента создания кеша if (user.LastUpdatePermisison.HasValue && dateHash > user.LastUpdatePermisison.Value) { return(permissionList); } } permissionList = new HashSet <string>(); // добавляем время обновления кеша первой строкой permissionList.Add(DateTime.Now.ToString("O")); var ps = user.AccountGroup.SelectMany(x => x.AccountPermission) .Where(x => x.Enabled && x.TypePermission == type) .Select(x => $"{x.ControllerAction}_{x.ActionAttributes}") .Distinct().ToList(); foreach (var p in ps) { permissionList.Add(p); } HttpContext.Cache.Insert(key, permissionList, null, DateTime.UtcNow.AddSeconds(300), Cache.NoSlidingExpiration); return(permissionList); }
/// <summary> /// Проверяет наличие пермишена в списке пермишенов пользователя /// </summary> /// <returns></returns> public bool PermissionUserExsist(Account user, TypeUsers accessType) { var permissionList = GetPermissionList(user, accessType); var permissionKey = $"{permissionName}_{controllerAcctributes}"; return(permissionList.Contains(permissionKey)); }
/// <summary> /// Проверка прав пользователя /// </summary> /// <param name="filterContext"></param> private void CheckUserPermission(Account user, TypeUsers accessType, ActionExecutingContext filterContext) { // если пользователя нет, но он пришёл из панели управления - на регистрацию if (user == null && accessType == TypeUsers.ControlPanelUser) { filterContext.Result = RedirectToAction("Index", "Registration"); } // если пользователя нет - на главную else if (user == null) { filterContext.Result = Redirect("~"); } // если есть пользователь и права доступа else if (PermissionUserExsist(user, accessType)) { return; } // если есть пользователь и нет прав доступа else { ErrorMessage("У вас нет прав доступа к запрашиваемой странице"); var refferer = filterContext.HttpContext.Request.UrlReferrer; if (refferer != null && !String.IsNullOrEmpty(refferer.OriginalString)) { filterContext.Result = Redirect(refferer.OriginalString); } else { filterContext.Result = Redirect("~"); } } }
protected void SecurityCheck(Account user, TypeUsers accessType, ActionExecutingContext filterContext) { // если найден в игнорируемых if (IgnoreRoutePermission()) { return; } // проверка наличия пермишена в БД и добавление в случае отсутствия AddPermission(accessType); // проверка прав у Пользователя к данному сонтроллеру и экшену (Get, Post etc важно для нас) CheckUserPermission(user, accessType, filterContext); }
private void LoadTypeUsers() { //var products = dataService.GetAllProducts(false); //Products.Clear(); //foreach (var product in products) //{ TypeUsers.Clear(); TypeUsers.Add(new TypeUser { Description = "Automovilista", Price = 20, UserTypeId = 2, }); TypeUsers.Add(new TypeUser { Description = "Administrador", Price = 20, UserTypeId = 4, }); //} }
/// <summary> /// проверка наличия пермишена в БД и добавление в случае отсутствия /// </summary> private void AddPermission(TypeUsers accessType) { var type = (sbyte)accessType; var permissionExsist = DB.AccountPermission.Any(x => x.TypePermission == type && x.ControllerAction == permissionName && x.ActionAttributes == controllerAcctributes); // пермишен есть в БД, добавлять ничего не требуется if (permissionExsist) { return; } // если пермишена в БД нет, то добаляем пермишен к группе администраторов // проверим наличие группы "Администраторы" var adminGroupName = ConfigurationManager.AppSettings["AdminGroupName"]; // убрал условие Enabled потому что группа будет создана заново, если disabled var adminGroup = DB.AccountGroup.SingleOrDefault(x => x.Name == adminGroupName && x.TypeGroup == type); // добавляем новый доступ var newPermission = new AccountPermission { ControllerAction = permissionName, ActionAttributes = controllerAcctributes, TypePermission = type, Enabled = true, Description = "новый пермишен" }; DB.AccountPermission.Add(newPermission); DB.SaveChanges(); // добавляем его к группе Администраторы adminGroup.AccountPermission.Add(newPermission); var date = DateTime.Now; foreach (var user in adminGroup.Account) { user.LastUpdatePermisison = date; } DB.SaveChanges(); }