Exemplo n.º 1
0
 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;
            }
        }