private bool TryGetEntityRight(string entityName, out EntityRightData right) { right = null; if (EntityRights == null || string.IsNullOrEmpty(entityName)) { return(false); } return(EntityRights.TryGetValue(entityName, out right)); }
private static Dictionary <string, EntityRightData> GetEntityRightsModel(ISecurityDbContext context, Guid profileId) { var entityRights = GetEntityRights(context, profileId); var entityRightsModel = new Dictionary <string, EntityRightData>(); foreach (var right in entityRights) { var maxAccessLevel = right.Max(el => el.EntityAccessLevel); var entityRight = new EntityRightData { EntityName = right.Key, EntityAccessLevel = maxAccessLevel }; entityRightsModel.Add(right.Key, entityRight); if (maxAccessLevel != EntityAccessLevel.Partial) { continue; } // in case of partial access we need combining rights in a special way // if there is role with full entity read access, then we need reflection to get all the properties var fieldRights = new Dictionary <string, AccessLevel>(); foreach (var fields in right) { if (fields.EntityAccessLevel == EntityAccessLevel.Partial) { foreach (var field in fields.FieldRights) { fieldRights.Add(field.FieldName, field.AccessLevel); } } else if (fields.EntityAccessLevel == EntityAccessLevel.Read) { var properties = context.GetApplicationModels() .Where(model => model.Name == fields.EntityName) .FirstOrDefault() ?.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); if (properties != null) { foreach (var prop in properties) { fieldRights.Add(prop.Name, AccessLevel.Read); } } } } var combinedFieldRights = fieldRights.GroupBy(kv => kv.Key) .Select(g => new { FieldName = g.Key, AccessLevel = g.Max(el => el.Value) }) .Where(kv => kv.AccessLevel != AccessLevel.No) .ToDictionary(g => g.FieldName, g => g.AccessLevel); if (combinedFieldRights.Count == 0) { entityRight.EntityAccessLevel = EntityAccessLevel.No; } else { entityRight.FieldRights = combinedFieldRights; } } return(entityRightsModel); }