示例#1
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;

            var errorMark = 0;
            var tableName = BaseModuleEntity.CurrentTableName;

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

            try
            {
                errorMark = 1;

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

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

                var sb = Pool.StringBuilder.Get();
                // 用户的操作权限
                sb.Append("SELECT " + BasePermissionEntity.FieldPermissionId);
                sb.Append(" FROM " + CurrentTableName);
                sb.Append(" WHERE (" + BasePermissionEntity.FieldResourceCategory + " = " + DbHelper.GetParameter(BaseUserEntity.CurrentTableName + "_" + BasePermissionEntity.FieldResourceCategory));
                sb.Append(" AND " + BasePermissionEntity.FieldResourceId + " = " + DbHelper.GetParameter(BaseUserEntity.CurrentTableName + "_" + BaseUserEntity.FieldId));
                sb.Append(" AND " + BasePermissionEntity.FieldEnabled + " = 1 ");
                sb.Append(" AND " + BasePermissionEntity.FieldDeleted + " = 0)");

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

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

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

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

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

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

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

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

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

                var ids = new List <string>();
                errorMark = 3;
                var dataReader = DbHelper.ExecuteReader(sb.ToString(), dbParameters.ToArray());
                if (dataReader != null && !dataReader.IsClosed)
                {
                    while (dataReader.Read())
                    {
                        ids.Add(dataReader[BasePermissionEntity.FieldPermissionId].ToString());
                    }

                    dataReader.Close();
                }

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

                // 按部门(组织机构)获取权限项
                if (BaseSystemInfo.UseOrganizationPermission)
                {
                    if (!string.IsNullOrEmpty(companyId))
                    {
                        sb.Clear();
                        sb.Append("SELECT " + BasePermissionEntity.FieldPermissionId);
                        sb.Append(" FROM " + CurrentTableName);
                        sb.Append(" WHERE " + BasePermissionEntity.FieldResourceCategory + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldResourceCategory));
                        sb.Append(" AND " + BasePermissionEntity.FieldPermissionId + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldPermissionId));
                        sb.Append(" AND " + BasePermissionEntity.FieldEnabled + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldEnabled));
                        sb.Append(" AND " + BasePermissionEntity.FieldDeleted + " = " + DbHelper.GetParameter(BasePermissionEntity.FieldDeleted));
                        // dt = DbHelper.Fill(sql);
                        // string[] organizationPermission = BaseUtil.FieldToArray(dt, BasePermissionEntity.FieldPermissionId).Distinct<string>().Where(t => !string.IsNullOrEmpty(t)).ToArray();
                        // 2015-12-02 吉日嘎拉 优化参数,用ExecuteReader,提高效率节约内存。
                        dbParameters = new List <IDbDataParameter>
                        {
                            DbHelper.MakeParameter(BasePermissionEntity.FieldResourceCategory, BaseOrganizationEntity.CurrentTableName),
                            DbHelper.MakeParameter(BasePermissionEntity.FieldPermissionId, companyId),
                            DbHelper.MakeParameter(BasePermissionEntity.FieldEnabled, 1),
                            DbHelper.MakeParameter(BasePermissionEntity.FieldDeleted, 0)
                        };
                        ids        = new List <string>();
                        errorMark  = 4;
                        dataReader = DbHelper.ExecuteReader(sb.Put(), dbParameters.ToArray());
                        if (dataReader != null && !dataReader.IsClosed)
                        {
                            while (dataReader.Read())
                            {
                                ids.Add(dataReader[BasePermissionEntity.FieldPermissionId].ToString());
                            }

                            dataReader.Close();
                        }

                        // string[] organizationPermission = ids.ToArray();
                        result = StringUtil.Concat(result, ids.ToArray());
                    }
                }
            }
            catch (Exception ex)
            {
                var writeMessage = "BasePermissionManager.GetPermissionIdsByUser:发生时间:" + DateTime.Now
                                   + Environment.NewLine + "errorMark = " + errorMark
                                   + Environment.NewLine + "Message:" + ex.Message
                                   + Environment.NewLine + "Source:" + ex.Source
                                   + Environment.NewLine + "StackTrace:" + ex.StackTrace
                                   + Environment.NewLine + "TargetSite:" + ex.TargetSite
                                   + Environment.NewLine;

                LogUtil.WriteLog(writeMessage, "Exception");
            }

            return(result);
        }
示例#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 static string[] GetPermissionIdsByUserByCache(string systemCode, string userId, string companyId = null, bool containPublic = true, bool useBaseRole = false)
        {
            // 公开的操作权限需要计算
            string[] result = null;

            var errorMark = 0;
            var tableName = BaseModuleEntity.CurrentTableName;

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

            try
            {
                errorMark = 1;

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

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

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

                // 用户都在哪些角色里?通过缓存读取?没有角色的,没必要进行运算了
                var roleIds = BaseUserManager.GetRoleIdsByCache(systemCode, userId, companyId);
                if (useBaseRole && !systemCode.Equals("Base", StringComparison.OrdinalIgnoreCase))
                {
                    var baseRoleIds = BaseUserManager.GetRoleIdsByCache("Base", userId, companyId);
                    if (baseRoleIds != null && baseRoleIds.Length > 0)
                    {
                        roleIds = StringUtil.Concat(roleIds, baseRoleIds);
                    }
                }
                if (roleIds != null && roleIds.Length > 0)
                {
                    var userRolePermissionIds = BasePermissionManager.GetPermissionIdsByCache(systemCode, roleIds);
                    result = StringUtil.Concat(result, userRolePermissionIds);
                }
            }
            catch (Exception ex)
            {
                var writeMessage = "BasePermissionManager.GetPermissionIdsByUser:发生时间:" + DateTime.Now
                                   + Environment.NewLine + "errorMark = " + errorMark
                                   + Environment.NewLine + "Message:" + ex.Message
                                   + Environment.NewLine + "Source:" + ex.Source
                                   + Environment.NewLine + "StackTrace:" + ex.StackTrace
                                   + Environment.NewLine + "TargetSite:" + ex.TargetSite
                                   + Environment.NewLine;

                LogUtil.WriteLog(writeMessage, "Exception");
            }

            return(result);
        }