Ejemplo n.º 1
0
        /// <summary>
        /// 删除实体角色信息信息
        /// </summary>
        /// <param name="ids">要删除的实体角色信息编号</param>
        /// <returns>业务操作结果</returns>
        public virtual async Task <OperationResult> DeleteEntityRoles(params Guid[] ids)
        {
            List <(string, string)> list   = new List <(string, string)>();
            OperationResult         result = await _entityRoleRepository.DeleteAsync(ids,
                                                                                     async entity =>
            {
                TRole role             = await _roleRepository.GetAsync(entity.RoleId);
                TEntityInfo entityInfo = await _entityInfoRepository.GetAsync(entity.EntityId);
                if (role != null && entityInfo != null)
                {
                    list.Add((role.Name, entityInfo.TypeName));
                }
            });

            if (result.Successed && list.Count > 0)
            {
                //移除数据权限缓存
                IDataAuthCache cache = ServiceLocator.Instance.GetService <IDataAuthCache>();
                foreach ((string roleName, string typeName) in list)
                {
                    cache.RemoveCache(roleName, typeName, DataAuthOperation.Delete);
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 应用模块服务
        /// </summary>
        /// <param name="provider">服务提供者</param>
        public override void UsePack(IServiceProvider provider)
        {
            IModuleHandler moduleHandler = provider.GetService <IModuleHandler>();

            moduleHandler.Initialize();

            //初始化各种缓存
            IFunctionHandler functionHandler = provider.GetService <IFunctionHandler>();

            functionHandler.RefreshCache();

            IEntityInfoHandler entityInfoHandler = provider.GetService <IEntityInfoHandler>();

            entityInfoHandler.RefreshCache();

            IFunctionAuthCache functionAuthCache = provider.GetService <IFunctionAuthCache>();

            functionAuthCache.BuildRoleCaches();

            IDataAuthCache dataAuthCache = provider.GetService <IDataAuthCache>();

            dataAuthCache.BuildCaches();

            IsEnabled = true;
        }
        /// <summary>
        /// 事件处理
        /// </summary>
        /// <param name="eventData">事件源数据</param>
        public override void Handle(DataAuthCacheRefreshEventData eventData)
        {
            IDataAuthCache cache = ServiceLocator.Instance.GetService <IDataAuthCache>();

            foreach (DataAuthCacheItem cacheItem in eventData.CacheItems)
            {
                cache.SetCache(cacheItem);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 获取指定查询条件组的查询表达式,并综合数据权限
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="group">传入的查询条件组,为空时则只返回数据权限过滤器</param>
        /// <param name="operation">数据权限操作</param>
        /// <returns>综合之后的表达式</returns>
        public virtual Expression <Func <T, bool> > GetDataFilterExpression <T>(FilterGroup group           = null,
                                                                                DataAuthOperation operation = DataAuthOperation.Read)
        {
            Expression <Func <T, bool> > exp = m => true;

            if (group != null)
            {
                exp = GetExpression <T>(group);
            }
            //从缓存中查找当前用户的角色与实体T的过滤条件
            ClaimsPrincipal user = _serviceProvider.GetCurrentUser();

            if (user == null)
            {
                return(exp);
            }

            IDataAuthCache dataAuthCache = _serviceProvider.GetService <IDataAuthCache>();

            if (dataAuthCache == null)
            {
                return(exp);
            }

            // 要判断数据权限功能,先要排除没有执行当前功能权限的角色,判断剩余角色的数据权限
            string[]         roleNames  = user.Identity.GetRoles();
            ScopedDictionary scopedDict = _serviceProvider.GetService <ScopedDictionary>();

            if (scopedDict?.Function != null)
            {
                roleNames = scopedDict.DataAuthValidRoleNames;
            }
            string typeName = typeof(T).GetFullNameWithModule();
            Expression <Func <T, bool> > subExp = null;

            foreach (string roleName in roleNames)
            {
                FilterGroup subGroup = dataAuthCache.GetFilterGroup(roleName, typeName, operation);
                if (subGroup == null)
                {
                    continue;
                }
                subExp = subExp == null?GetExpression <T>(subGroup) : subExp.Or(GetExpression <T>(subGroup));
            }
            if (subExp != null)
            {
                if (group == null)
                {
                    return(subExp);
                }
                exp = subExp.And(exp);
            }

            return(exp);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 应用模块服务
        /// </summary>
        /// <param name="provider">服务提供者</param>
        public override void UsePack(IServiceProvider provider)
        {
            IEntityInfoHandler entityInfoHandler = provider.GetService <IEntityInfoHandler>();

            entityInfoHandler.RefreshCache();

            IDataAuthCache dataAuthCache = provider.GetService <IDataAuthCache>();

            dataAuthCache.BuildCaches();

            IsEnabled = true;
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 获取指定查询条件组的查询表达式,并综合数据权限
        /// </summary>
        /// <typeparam name="T">实体类型</typeparam>
        /// <param name="group">传入的查询条件组,为空时则只返回数据权限过滤器</param>
        /// <returns></returns>
        public static Expression <Func <T, bool> > GetDataFilterExpression <T>(FilterGroup group = null)
        {
            Expression <Func <T, bool> > exp = m => true;

            if (group != null)
            {
                exp = GetExpression <T>(group);
            }
            //从缓存中查找当前用户的角色与实体T的过滤条件
            ClaimsPrincipal user = ServiceLocator.Instance.GetCurrentUser();

            if (user == null)
            {
                return(exp);
            }

            IDataAuthCache cache = ServiceLocator.Instance.GetService <IDataAuthCache>();

            if (cache == null)
            {
                return(exp);
            }

            string[] roleNames = user.Identity.GetRoles();
            string   typeName  = typeof(T).FullName;
            Expression <Func <T, bool> > subExp = null;

            foreach (string roleName in roleNames)
            {
                FilterGroup subGroup = cache.GetFilterGroup(roleName, typeName);
                if (subGroup == null)
                {
                    continue;
                }
                subExp = subExp == null?GetExpression <T>(subGroup) : subExp.Or(GetExpression <T>(subGroup));
            }
            if (subExp != null)
            {
                if (group == null)
                {
                    return(subExp);
                }
                exp = subExp.And(exp);
            }

            return(exp);
        }
 /// <summary>
 /// 初始化一个<see cref="DataAuthCacheRefreshEventHandler"/>类型的新实例
 /// </summary>
 public DataAuthCacheRefreshEventHandler(IDataAuthCache authCache)
 {
     _authCache = authCache;
 }