public static int RefreshCache(string systemCode)
        {
            int result = 0;

            List <BaseModuleEntity> list = BaseModuleManager.GetEntitiesByCache(systemCode, true);

            foreach (var entity in list)
            {
                // 2016-02-29 吉日嘎拉 强制刷新缓存
                BaseModuleManager.GetObjectByCache(systemCode, entity.Id, true);
            }

            return(result);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 获取用户的权限主键数组
        /// </summary>
        /// <param name="systemCode">系统编号</param>
        /// <param name="userId">用户主键</param>
        /// <param name="companyId">公司主键</param>
        /// <param name="containPublic">公开的也包含</param>
        /// <param name="useBaseRole">使用基础角色权限</param>
        /// <returns>拥有权限数组</returns>
        public string[] GetPermissionIdsByUser(string systemCode, string userId, string companyId = null, bool containPublic = true, bool useBaseRole = false)
        {
            // 公开的操作权限需要计算
            string[] result = null;

            int    errorMark = 0;
            string tableName = BaseModuleEntity.TableName;

            if (string.IsNullOrWhiteSpace(systemCode))
            {
                systemCode = "Base";
            }
            // 就不需要参合基础的角色了
            if (systemCode.Equals("Base"))
            {
                useBaseRole = false;
            }
            tableName = systemCode + "Module";

            try
            {
                errorMark = 1;

                if (containPublic)
                {
                    // 把公开的部分获取出来(把公开的主键数组从缓存里获取出来,减少数据库的读取次数)
                    List <BaseModuleEntity> moduleEntities = BaseModuleManager.GetEntitiesByCache(systemCode);
                    if (moduleEntities != null)
                    {
                        result = moduleEntities.Where((t => t.IsPublic == 1 && t.Enabled == 1 && t.DeletionStateCode == 0)).Select(t => t.Id.ToString()).ToArray();
                    }
                }

                tableName = systemCode + "UserRole";
                string roleTableName = systemCode + "Role";
                this.CurrentTableName = systemCode + "Permission";
                List <IDbDataParameter> dbParameters = new List <IDbDataParameter>();

                StringBuilder sqlQuery = new StringBuilder();
                // 用户的操作权限
                sqlQuery.Append(" SELECT " + BasePermissionEntity.FieldPermissionId);
                sqlQuery.Append("   FROM " + this.CurrentTableName);
                sqlQuery.Append("  WHERE (" + BasePermissionEntity.FieldResourceCategory + " = " + DbHelper.GetParameter(BaseUserEntity.TableName + "_" + BasePermissionEntity.FieldResourceCategory));
                sqlQuery.Append("        AND " + BasePermissionEntity.FieldResourceId + " = " + DbHelper.GetParameter(BaseUserEntity.TableName + "_" + BaseUserEntity.FieldId));
                sqlQuery.Append("        AND " + BasePermissionEntity.FieldEnabled + " = 1 ");
                sqlQuery.Append("        AND " + BasePermissionEntity.FieldDeletionStateCode + " = 0)");

                dbParameters.Add(DbHelper.MakeParameter(BaseUserEntity.TableName + "_" + BasePermissionEntity.FieldResourceCategory, BaseUserEntity.TableName));
                dbParameters.Add(DbHelper.MakeParameter(BaseUserEntity.TableName + "_" + BaseUserEntity.FieldId, userId));

                // 角色的操作权限
                sqlQuery.Append("  UNION ");

                sqlQuery.Append(" SELECT " + BasePermissionEntity.FieldPermissionId);
                sqlQuery.Append("   FROM " + this.CurrentTableName);
                sqlQuery.Append("        , ( SELECT " + BaseUserRoleEntity.FieldRoleId);
                sqlQuery.Append("   FROM " + tableName);
                sqlQuery.Append("  WHERE (" + BaseUserRoleEntity.FieldUserId + " = " + DbHelper.GetParameter(BaseUserRoleEntity.TableName + "_" + BaseUserRoleEntity.FieldUserId));
                sqlQuery.Append("        AND " + BaseUserRoleEntity.FieldEnabled + " = 1 ");
                sqlQuery.Append("        AND " + BaseUserRoleEntity.FieldDeletionStateCode + " = 0 ) ");

                dbParameters.Add(DbHelper.MakeParameter(BaseUserRoleEntity.TableName + "_" + BaseUserRoleEntity.FieldUserId, userId));

                // 2015-12-02 吉日嘎拉 简化SQL语句,提高效率
                if (useBaseRole && !systemCode.Equals("Base", StringComparison.OrdinalIgnoreCase))
                {
                    // 是否使用基础角色的权限
                    sqlQuery.Append(" UNION SELECT " + BaseUserRoleEntity.FieldRoleId);
                    sqlQuery.Append("   FROM " + BaseUserRoleEntity.TableName);
                    sqlQuery.Append("  WHERE ( " + BaseUserRoleEntity.FieldUserId + " = " + DbHelper.GetParameter(BaseUserRoleEntity.TableName + "_USEBASE_" + BaseUserRoleEntity.FieldUserId));
                    sqlQuery.Append("        AND " + BaseUserRoleEntity.FieldEnabled + " = 1 ");
                    sqlQuery.Append("        AND " + BaseUserRoleEntity.FieldDeletionStateCode + " = 0 ) ");

                    dbParameters.Add(DbHelper.MakeParameter(BaseUserRoleEntity.TableName + "_USEBASE_" + BaseUserRoleEntity.FieldUserId, userId));
                }

                /*
                 * // 角色与部门是否进行关联?
                 * // 2015-12-02 吉日嘎拉 这里基本上没在用的,心里有个数。
                 * if (BaseSystemInfo.UseRoleOrganize && !string.IsNullOrEmpty(companyId))
                 * {
                 *  string roleOrganizeTableName = systemCode + "RoleOrganize";
                 *  sqlQuery.Append(" UNION SELECT " + BaseRoleOrganizeEntity.FieldRoleId);
                 *  sqlQuery.Append("   FROM " + roleOrganizeTableName);
                 *  sqlQuery.Append("  WHERE ( " + BaseRoleOrganizeEntity.FieldOrganizeId + " = " + DbHelper.GetParameter(BaseRoleOrganizeEntity.FieldOrganizeId));
                 *  sqlQuery.Append("        AND " + BaseRoleOrganizeEntity.FieldEnabled + " = 1 ");
                 *  sqlQuery.Append("        AND " + BaseRoleOrganizeEntity.FieldDeletionStateCode + " = 0 )");
                 *  dbParameters.Add(DbHelper.MakeParameter(BaseRoleOrganizeEntity.FieldOrganizeId, companyId));
                 * }
                 */

                sqlQuery.Append(") B ");
                sqlQuery.Append("   WHERE " + BasePermissionEntity.FieldResourceCategory + " = " + DbHelper.GetParameter(BaseRoleEntity.TableName + "_" + BasePermissionEntity.FieldResourceCategory));
                sqlQuery.Append("        AND " + this.CurrentTableName + "." + BasePermissionEntity.FieldResourceId + " = B." + BaseUserRoleEntity.FieldRoleId);
                sqlQuery.Append("        AND " + this.CurrentTableName + "." + BasePermissionEntity.FieldEnabled + " = 1 ");
                sqlQuery.Append("        AND " + this.CurrentTableName + "." + BasePermissionEntity.FieldDeletionStateCode + " = 0 ");

                dbParameters.Add(DbHelper.MakeParameter(BaseRoleEntity.TableName + "_" + BasePermissionEntity.FieldResourceCategory, roleTableName));

                List <string> ids = new List <string>();
                errorMark = 3;
                using (IDataReader dataReader = DbHelper.ExecuteReader(sqlQuery.ToString(), dbParameters.ToArray()))
                {
                    while (dataReader.Read())
                    {
                        ids.Add(dataReader[BasePermissionEntity.FieldPermissionId].ToString());
                    }
                }

                // string[] userRolePermissionIds = ids.ToArray();
                result = StringUtil.Concat(result, ids.ToArray());

                // 按部门(组织机构)获取权限项
                if (BaseSystemInfo.UseOrganizePermission)
                {
                    if (!string.IsNullOrEmpty(companyId))
                    {
                        sqlQuery = new StringBuilder();
                        sqlQuery.Append(" SELECT " + BasePermissionEntity.FieldPermissionId);
                        sqlQuery.Append("   FROM " + this.CurrentTableName);
                        sqlQuery.Append("  WHERE " + BasePermissionEntity.FieldResourceCategory + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldResourceCategory));
                        sqlQuery.Append("        AND " + BasePermissionEntity.FieldPermissionId + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldPermissionId));
                        sqlQuery.Append("        AND " + BasePermissionEntity.FieldEnabled + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldEnabled));
                        sqlQuery.Append("        AND " + BasePermissionEntity.FieldDeletionStateCode + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldDeletionStateCode));
                        // dt = DbHelper.Fill(sqlQuery);
                        // string[] organizePermission = BaseBusinessLogic.FieldToArray(dt, BasePermissionEntity.FieldPermissionId).Distinct<string>().Where(t => !string.IsNullOrEmpty(t)).ToArray();
                        // 2015-12-02 吉日嘎拉 优化参数,用ExecuteReader,提高效率节约内存。
                        dbParameters = new List <IDbDataParameter>();
                        dbParameters.Add(DbHelper.MakeParameter(BasePermissionEntity.FieldResourceCategory, BaseOrganizeEntity.TableName));
                        dbParameters.Add(DbHelper.MakeParameter(BasePermissionEntity.FieldPermissionId, companyId));
                        dbParameters.Add(DbHelper.MakeParameter(BasePermissionEntity.FieldEnabled, 1));
                        dbParameters.Add(DbHelper.MakeParameter(BasePermissionEntity.FieldDeletionStateCode, 0));
                        ids       = new List <string>();
                        errorMark = 4;
                        using (IDataReader dataReader = DbHelper.ExecuteReader(sqlQuery.ToString(), dbParameters.ToArray()))
                        {
                            while (dataReader.Read())
                            {
                                ids.Add(dataReader[BasePermissionEntity.FieldPermissionId].ToString());
                            }
                        }
                        // string[] organizePermission = ids.ToArray();
                        result = StringUtil.Concat(result, ids.ToArray());
                    }
                }
            }
            catch (System.Exception ex)
            {
                string writeMessage = "BasePermissionManager.GetPermissionIdsByUser:发生时间:" + DateTime.Now
                                      + System.Environment.NewLine + "errorMark = " + errorMark.ToString()
                                      + System.Environment.NewLine + "Message:" + ex.Message
                                      + System.Environment.NewLine + "Source:" + ex.Source
                                      + System.Environment.NewLine + "StackTrace:" + ex.StackTrace
                                      + System.Environment.NewLine + "TargetSite:" + ex.TargetSite
                                      + System.Environment.NewLine;

                FileUtil.WriteMessage(writeMessage, BaseSystemInfo.StartupPath + "//Exception//Exception" + DateTime.Now.ToString(BaseSystemInfo.DateFormat) + ".txt");
            }

            return(result);
        }
Exemplo n.º 3
0
        //
        // 从数据库获取权限
        //

        public List <BaseModuleEntity> GetPermissionListByUser(string systemCode, string userId, string companyId = null, bool fromCache = false)
        {
            List <BaseModuleEntity> result = new List <BaseModuleEntity>();

            bool useBaseRole = false;

            string key       = "BaseModule";
            string tableName = "BaseModule";

            if (!string.IsNullOrWhiteSpace(systemCode))
            {
                key       = systemCode + "Module";
                tableName = systemCode + "Module";

                // 2015-11-19 所有的系统都继承基础角色的权限
                useBaseRole = true;
                // 2015-01-21 吉日嘎拉,实现判断别人的权限,是否超级管理员
                bool isAdministrator = false;

                if (UserInfo != null && UserInfo.IsAdministrator)
                {
                    if (UserInfo.Id.Equals(userId, StringComparison.CurrentCulture))
                    {
                        isAdministrator = true;
                    }
                    else
                    {
                        BaseUserManager userManager = new BaseUserManager(UserInfo);
                        isAdministrator = userManager.IsAdministrator(userId);
                    }
                }
                if (isAdministrator)
                {
                    result = BaseModuleManager.GetEntitiesByCache(systemCode);
                }
                else
                {
                    string[] permissionIds = null;
                    // 2016-02-26 吉日嘎拉进行优化,用缓存与不用缓存感觉区别不是很大。
                    if (fromCache)
                    {
                        // permissionIds = GetPermissionIdsByUserByCache(systemCode, userId, companyId, useBaseRole);
                        permissionIds = GetPermissionIdsByUser(systemCode, userId, companyId, false, useBaseRole);
                    }
                    else
                    {
                        permissionIds = GetPermissionIdsByUser(systemCode, userId, companyId, false, useBaseRole);
                    }

                    // 2016-03-02 吉日嘎拉,少读一次缓存服务器,减少缓存服务器读写压力
                    List <BaseModuleEntity> entities = BaseModuleManager.GetEntitiesByCache(systemCode);
                    // 若是以前赋予的权限,后来有些权限设置为无效了,那就不应该再获取哪些无效的权限才对。
                    if (permissionIds != null && permissionIds.Length > 0)
                    {
                        result = (entities as List <BaseModuleEntity>).Where(t => (t.IsPublic == 1 && t.Enabled == 1 && t.DeletionStateCode == 0) || permissionIds.Contains(t.Id)).ToList();
                    }
                    else
                    {
                        result = (entities as List <BaseModuleEntity>).Where(t => t.IsPublic == 1 && t.Enabled == 1 && t.DeletionStateCode == 0).ToList();
                    }
                }
            }

            return(result);
        }
        /// <summary>
        /// 获取用户的权限主键数组
        /// </summary>
        /// <param name="systemCode">系统编号</param>
        /// <param name="userId">用户主键</param>
        /// <param name="companyId">公司主键</param>
        /// <param name="useBaseRole">使用基础角色权限</param>
        /// <returns>拥有权限数组</returns>
        public static string[] GetPermissionIdsByUserByCache(string systemCode, string userId, string companyId = null, bool containPublic = true, bool useBaseRole = false)
        {
            // 公开的操作权限需要计算
            string[] result = null;

            int    errorMark = 0;
            string tableName = BaseModuleEntity.TableName;

            if (string.IsNullOrWhiteSpace(systemCode))
            {
                systemCode = "Base";
            }
            // 就不需要参合基础的角色了
            if (systemCode.Equals("Base"))
            {
                useBaseRole = false;
            }
            tableName = systemCode + "Module";

            try
            {
                errorMark = 1;

                // 01: 把公开的部分获取出来(把公开的主键数组从缓存里获取出来,减少数据库的读取次数)
                if (containPublic)
                {
                    List <BaseModuleEntity> moduleEntities = BaseModuleManager.GetEntitiesByCache(systemCode);
                    if (moduleEntities != null)
                    {
                        result = moduleEntities.Where((t => t.IsPublic == 1 && t.Enabled == 1 && t.DeletionStateCode == 0)).Select(t => t.Id.ToString()).ToArray();
                    }
                }

                // 02: 获取用户本身拥有的权限
                string[] userPermissionIds = BaseUserPermissionManager.GetPermissionIdsByCache(systemCode, userId);
                result = StringUtil.Concat(result, userPermissionIds);

                // 03: 用户角色的操作权限

                // 用户都在哪些角色里?通过缓存读取?没有角色的,没必要进行运算了
                string[] roleIds = BaseUserManager.GetRoleIdsByCache(systemCode, userId, companyId);
                if (useBaseRole && !systemCode.Equals("Base", StringComparison.OrdinalIgnoreCase))
                {
                    string[] baseRoleIds = BaseUserManager.GetRoleIdsByCache("Base", userId, companyId);
                    if (baseRoleIds != null && baseRoleIds.Length > 0)
                    {
                        roleIds = StringUtil.Concat(roleIds, baseRoleIds);
                    }
                }
                if (roleIds != null && roleIds.Length > 0)
                {
                    string[] userRolePermissionIds = BaseRolePermissionManager.GetPermissionIdsByCache(systemCode, roleIds);
                    result = StringUtil.Concat(result, userRolePermissionIds);
                }

                // 04: 按部门(组织机构)获取权限项
                if (BaseSystemInfo.UseOrganizePermission && !string.IsNullOrEmpty(companyId))
                {
                    // 2016-02-26 吉日嘎拉,公司权限进行优化简化
                    string[] organizePermission = BaseOrganizePermissionManager.GetPermissionIdsByCache(systemCode, companyId);
                    result = StringUtil.Concat(result, organizePermission);
                }
            }
            catch (System.Exception ex)
            {
                string writeMessage = "BasePermissionManager.GetPermissionIdsByUser:发生时间:" + DateTime.Now
                                      + System.Environment.NewLine + "errorMark = " + errorMark.ToString()
                                      + System.Environment.NewLine + "Message:" + ex.Message
                                      + System.Environment.NewLine + "Source:" + ex.Source
                                      + System.Environment.NewLine + "StackTrace:" + ex.StackTrace
                                      + System.Environment.NewLine + "TargetSite:" + ex.TargetSite
                                      + System.Environment.NewLine;

                FileUtil.WriteMessage(writeMessage, BaseSystemInfo.StartupPath + "//Exception//Exception" + DateTime.Now.ToString(BaseSystemInfo.DateFormat) + ".txt");
            }

            return(result);
        }