void BuilderModuleDefineDataSource(ref DataTable dt, ModuleDefineCollection collection) { if (collection != null) { DataRow dr = null; foreach (ModuleDefine d in collection) { if (dt.Rows.Find(d.ModuleID) == null) { dr = dt.NewRow(); dr["ModuleID"] = d.ModuleID; dr["ParentModuleID"] = (d.Parent == null) ? string.Empty : d.Parent.ModuleID; dr["ModuleName"] = d.ModuleName; dr["ModuleUri"] = d.ModuleUri; dr["OrderNo"] = d.OrderNo; dt.Rows.Add(dr); } if (d.Modules != null && d.Modules.Count > 0) { this.BuilderModuleDefineDataSource(ref dt, d.Modules); } } } }
/// <summary> /// 验证用户模块。 /// </summary> public ModuleDefineCollection AuthenticateUserModules(ModuleDefineCollection modules, GUIDEx systemID, GUIDEx userID) { lock (this) { if (this.securityPermissionFacotry != null && modules != null && systemID.IsValid && userID.IsValid) { string key = string.Format("AUM_{0}_{1}_{2:yyyy-MM-dd-HH}", systemID, userID, DateTime.Now); ModuleDefineCollection result = this.cache[key] as ModuleDefineCollection; if (result == null) { result = new ModuleDefineCollection(); #region 定义表结构。 DataTable dtSource = new DataTable(); dtSource.Columns.Add("ModuleID", typeof(System.String)); dtSource.Columns.Add("ParentModuleID", typeof(System.String)); dtSource.Columns.Add("ModuleName", typeof(System.String)); dtSource.Columns.Add("ModuleUri", typeof(System.String)); dtSource.Columns.Add("OrderNo", typeof(System.Int32)); dtSource.PrimaryKey = new DataColumn[] { dtSource.Columns["ModuleID"] }; #endregion //转换为表结构。 this.AuthenticateUserModules(ref dtSource, modules); #region 校验权限。 if (dtSource != null && dtSource.Rows.Count > 0) { //获取有权限的模块ID。 List<GUIDEx> listRightModules = this.AuthenticateUserModules(dtSource, systemID, userID); if (listRightModules != null && listRightModules.Count > 0) { DataTable dtResult = dtSource.Clone(); //查找有权限的模块ID到结果数据集。 foreach (GUIDEx moduleID in listRightModules) { DataRow dr = dtSource.Rows.Find(moduleID); if (dr != null && (dtResult.Rows.Find(moduleID) == null)) dtResult.ImportRow(dr); } //整理结果数据集的结构。 DataRow[] parentRows = dtResult.Select("isnull(ParentModuleID,'') <> ''"); this.AuthenticateUserModules(ref dtResult, parentRows, dtSource.Copy()); #region 转换为对象。 DataRow[] drs = dtResult.Select("isnull(ParentModuleID,'') = ''", "OrderNo"); if (drs != null) { foreach (DataRow row in drs) { ModuleDefine moduleDefine = new ModuleDefine(Convert.ToString(row["ModuleID"]), Convert.ToString(row["ModuleName"]), Convert.ToString(row["ModuleUri"]), Convert.ToInt32(row["OrderNo"])); this.AuthenticateUserModules(moduleDefine, dtResult.Select(string.Format("isnull(ParentModuleID,'') = '{0}'", row["ModuleID"]), "OrderNo"), dtResult.Copy()); result.Add(moduleDefine); } } #endregion } } #endregion if (result.Count > 0) { this.cache.Insert(key, result, null, DateTime.Now.AddMinutes(30), TimeSpan.Zero); } } return result; } return modules; } }