/// <summary> /// 判断职员是否对某一项模块权限拥有肯定授权。 /// </summary> /// <remarks> /// 授权判断顺序如下: /// (1)职员是否为内置用户。如果是则返回true,否则执行下一步。 /// (2)职员本身是否对此权限做了否定授权。如果是则返回false,否则执行下一步。 /// (3)职员本身是否对此权限做了肯定授权。如果是则返回true,否则执行下一步。 /// (4)职员拥有的所有角色的集合中,是否有任何一个角色对此权限做了否定授权。如果是则返回false,否则执行下一步。 /// (5)职员拥有的所有角色的集合中,是否有任何一个角色对此权限做了肯定授权。如果是则返回true,否则执行下一步。 /// (6)返回false。(即职员不是内置用户,并且职员本身以及职员拥有的所有角色都没有提供对此权限的任何授权信息。) /// </remarks> /// <param name="moduleRight">模块权限。</param> /// <returns>是否有肯定授权。</returns> public bool HasGrantPermission(ModuleRight moduleRight) { if(this.IsInnerUser == 1) return true; if (this.ModuleRightsDeny.Contains(moduleRight)) return false; if (this.ModuleRightsGrant.Contains(moduleRight)) return true; bool hasRoleGrant = false; foreach (Role role in this.Roles) { if (role.ModuleRightsDeny.Contains(moduleRight)) return false; if (role.ModuleRightsGrant.Contains(moduleRight)) hasRoleGrant = true; } return hasRoleGrant; }
/// <summary> /// 更新模块。 /// </summary> /// <param name="dto">待更新模块的信息。</param> /// <returns>成功标示。(1:成功;-2:Tag重复。)</returns> public static string UpdateModule(ModuleDTO dto) { Module existingM = GetModuleByTag(dto.Tag); if (existingM != null && existingM.Id != dto.Id) { return "-2"; } Db.SessionFactory.EvictQueries("Module"); //模块基本信息。 Module m = Db.Session.Load(typeof(Module), dto.Id) as Module; m.Tag = dto.Tag; m.Name = dto.Name; m.Remark = dto.Remark; m.OrderId = dto.OrderId; m.ModuleUrl = dto.ModuleUrl; m.Disabled = dto.Disabled; //待删除的权限。 ArrayList ToBeRemoved = new ArrayList(); IDictionaryEnumerator ide = m.ModuleRights.GetEnumerator(); while (ide.MoveNext()) { string key = ((DictionaryEntry)ide.Current).Key.ToString(); bool isFind = false; for (int i = 0; i < dto.ModuleRights.Count; i++) { if (key == dto.ModuleRights[i].ToString()) { isFind = true; break; } } if (!isFind) { ToBeRemoved.Add(key); } } //待增加的权限。 ArrayList ToBeAdded = new ArrayList(); for (int i = 0; i < dto.ModuleRights.Count; i++) { if (!m.ModuleRights.Contains(dto.ModuleRights[i].ToString())) ToBeAdded.Add(dto.ModuleRights[i].ToString()); } //获取新增模块权限的主键值。 string[] Ids = null; if (ToBeAdded.Count > 0) Ids = IdGen.GetNextId(typeof(ModuleRight), ToBeAdded.Count); //向数据库保存新的模块信息和模块权限信息。 ITransaction transaction = Db.Session.BeginTransaction(); try { //删除权限。 foreach (object key in ToBeRemoved) { ModuleRight mr = m.ModuleRights[key] as ModuleRight; mr.RemoveAllPermissions(); mr.BreakAwayFromModule(); Db.Session.Delete(mr); } //增加权限。 for (int i = 0; i < ToBeAdded.Count; i++) { ModuleRight newMr = new ModuleRight(); newMr.Id = Ids[i]; newMr.RightTag = ToBeAdded[i].ToString(); m.AddModuleRight(newMr); Db.Session.Save(newMr); } Db.Session.Update(m); transaction.Commit(); return "1"; } catch { transaction.Rollback(); throw; } }
/// <summary> /// 新增模块。 /// </summary> /// <param name="dto">待新增模块的信息。</param> /// <returns>新模块的Id。(-2:Tag重复。)</returns> public static string InsertModule(ModuleDTO dto) { Module existingM = GetModuleByTag(dto.Tag); if (existingM != null) { return "-2"; } Db.SessionFactory.EvictQueries("Module"); //模块基本信息。 Module m = new Module(); m.Id = IdGen.GetNextId(typeof(Module)); m.Tag = dto.Tag; m.Name = dto.Name; m.Remark = dto.Remark; m.OrderId = dto.OrderId; m.ModuleUrl = dto.ModuleUrl; m.Disabled = dto.Disabled; //模块分类。 ModuleType mt = Db.Session.Load(typeof(ModuleType), dto.ModuleTypeId) as ModuleType; mt.AddModule(m); //获取新增模块权限的主键值。 string[] Ids = null; if (dto.ModuleRights.Count > 0) Ids = IdGen.GetNextId(typeof(ModuleRight), dto.ModuleRights.Count); //向数据库保存模块和模块权限。 ITransaction transaction = Db.Session.BeginTransaction(); try { Db.Session.Save(m); for (int i = 0; i < dto.ModuleRights.Count; i++) { ModuleRight mr = new ModuleRight(); mr.Id = Ids[i]; mr.RightTag = dto.ModuleRights[i].ToString(); m.AddModuleRight(mr); Db.Session.Save(mr); } transaction.Commit(); } catch { transaction.Rollback(); throw; } //返回新模块的Id。 return m.Id; }
/// <summary> /// 增加模块权限。 /// </summary> /// <param name="moduleRight">模块权限。</param> public void AddModuleRight(ModuleRight moduleRight) { this.ModuleRights.Add(moduleRight.RightTag, moduleRight); moduleRight.Module = this; }