/// <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); }
/// <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); }