MVC网站开发中权限管理的示例分析
创始人
2024-11-28 09:02:01
0次

一、前言

刚到公司没多长时间就开始接触MVC到现在不能说懂了,只能说到达会用这个层次吧,感觉MVC用来写Web还是很强大的,层次清晰。

关于权限管理这一块,自我感觉网站的权限主要分为菜单权限和角色权限,首先说角色权限,比较简单不同角色可以看到不同页面这就是角色权限,菜单权限也可以说是操作权限,就是具体到某一个按钮,或某一个下拉框的查看权限或使用权限。

二、角色权限

1.用户角色

首先来角色权限,每个用户有着多样不同的角色,一对多的关系。

MVC网站开发中权限管理的示例分析

2.菜单管理

在菜单管理中我们就可以这样管理,某一菜单,那一角色可以看到就打上√这样比较容易控制。

MVC网站开发中权限管理的示例分析

3.数据库

再来看数据库中,要有角色的表以及用户与角色关系表。

MVC网站开发中权限管理的示例分析

再就是角色与菜单的关系表,其中PermissionIDs字段为操作权限以|隔开。

MVC网站开发中权限管理的示例分析

MVC网站开发中权限管理的示例分析

4.用户登录

当用户登录时我们就可以根据登陆人的ID取到他的所有角色存到Session中,并根据登录人查出相应的菜单。 

//角色基本信息
   SqlHelperParameter sqlHelperParameterRole = new SqlHelperParameter();
   sqlHelperParameterRole.Add("UserId", dtUserRow["UserId"].ToString());
   DataTable dtRole = SqlHelper.ExecuteDataTable(@"
   select 
   Sys_Roles.RoleId,
   Sys_Roles.RoleName,
   Sys_Roles.Weight 
   from (
    select UserId,RoleId from Sys_UsersInRoles 
    where UserId =@UserId
   ) as a left join Sys_Roles on a.RoleId = Sys_Roles.RoleId", sqlHelperParameterRole);
   int dtRoleCount = dtRole.Rows.Count;
   RoleWeightMax = int.MaxValue;
   for (int i = 0; i < dtRoleCount; i++)
   {
    RolesSession rs = new RolesSession();
    rs.RoleID = Guid.Parse(dtRole.Rows[i]["RoleId"].ToString());
    rs.RoleName = dtRole.Rows[i]["RoleName"].ToString();
    rs.Weight = Convert.ToInt32(dtRole.Rows[i]["Weight"]);
    if (RoleWeightMax > rs.Weight)
    {
     RoleWeightMax = rs.Weight;
    }
    RoleList.Add(rs);
   }
public class RolesSession
 {
  public Guid RoleID { get; set; }
  public string RoleName { get; set; }
  //权重
  public int Weight { get; set; }
 }

前台代码:

 
 
  @H9C.PMS.BLL.LogOn.MenuList.GetMenu(ViewBag.UserName)
 

控制器: 

public static MvcHtmlString GetMenu(string userName)
  {
   Menu menu = new Menu();
   MenuStructure ms = menu.GetMenuListStructure(userName);
   if (ms != null)
   {
    ms.Children.Remove(ms.Children.FirstOrDefault(o => o.ModelCode == "0" && o.ParentID == "0"));
   }
   return new MvcHtmlString(MenuNav("0", ms));
  }

  private static string MenuNav(string menuCode, MenuStructure menuStruc)
  {
   if (menuStruc == null)
   {
    return "
没有可用菜单
";    }    List list = menuStruc.Children.Where(m => m.ParentID == menuCode).ToList();    StringBuilder sbMenu = new StringBuilder();    foreach (var item in list)    {     if (item.ParentID == "0")     {      sbMenu.Append("");      sbMenu.Append("");      sbMenu.Append("
  • ");     }     else     {      sbMenu.Append("");      if (item.Children.Count == 0)      {       sbMenu.Append("
  • ");      }      else      {       sbMenu.Append("");      }     }     sbMenu.Append("");     if (item.Url == "/")     {      sbMenu.Append("");     }     else     {      string tabsIcon = "14";      if (!string.IsNullOrWhiteSpace(item.Icon))      {       tabsIcon = item.Icon.Replace("/Content/images/", "").Replace(".png", "");      }      sbMenu.Append("");      sbMenu.Append("");     }     sbMenu.Append("" + item.Title + "");     sbMenu.Append("");     if (IsExistParent(item.ModelCode, item))     {      sbMenu.Append(MenuNav(item.ModelCode, item));     }     sbMenu.Append("
  • ");     sbMenu.Append("");     if (item.ParentID == "0")     {      sbMenu.Append("
    ");     }    }    return sbMenu.ToString();   }   private static bool IsExistParent(string modelCode, MenuStructure menuModels)   {    var query = menuModels.Children.FirstOrDefault(m => m.ParentID == modelCode);    if (query == null)    {     return false;    }    return true;   }

    菜单类: 

    public class MenuStructure
     {
      public string ModelCode;
      public string Title;
      public string Icon;
      public string Url;
      public string ParentID;
      public List Children = new List();
     }

    其中GetMenuListStructure()方法就是根据用户名获取菜单列表结构,我这里用户名在数据库中是唯一的,在这里注意一点比较麻烦的是根据类可以看出菜单是有父菜单子菜单的所以方法中需要有两个循环去添加。 

    三、菜单权限
    也就是操作权限,比如某一按钮的操作权限。首先我们把所有关于按钮的操作权限存放到一个类中,(有更好的方法请向我推荐谢谢)

    MVC网站开发中权限管理的示例分析

    public class Menus
     {
      public static int gongdan = 503000000;//任务工单
     }

    然后我们需要操作权限的按钮所在的页面的Controllers(加载页面)中存到ViewBag里,如下: 

    public ActionResult Index()
      {H9C.PMS.BLL.RBAC.Permission pm = new BLL.RBAC.Permission();
    ViewBag.IsReportPlan = pm.IsRoleHavePermissions(Roles.Shigongduizhang, Menus.gongdan, base.UserSessionModel, Menus.GongdanReportPlanByShiGongTeamer); //上报施工计划
    
    
       return View();
      }
    /// 
      /// 判断某权限是否在获取某角色权限的列表中
      /// 
      /// 
      /// 
      /// 
      /// 
      /// 
      public bool IsRoleHavePermissions(Guid roleId, int modelCode, UserSessionModel userSessionModel, int permissionCode)
      {
       List permissionModelList = this.GetRolePermissionList(roleId, modelCode, userSessionModel);
       if (permissionModelList == null)
       {
        return false;
       }
       foreach (var o in permissionModelList)
       {
        if (o.PCode == permissionCode)
        {
         return true;
        }
       }
       return false;
      }
    /// 
      /// 获取某角色权限的列表
      /// 
      /// 
      /// 
      /// 
      /// 
      public List GetRolePermissionList(Guid roleId, int modelCode, UserSessionModel userSessionModel)
      {
       foreach (var o in userSessionModel.RoleList)
       {
        if (o.RoleID == roleId)
        {
         List permissionList = this.PermissionList(roleId, modelCode);
         return permissionList;
        }
       }
       return null;
      }
    /// 
      /// 获取某菜单某角色下具有的权限
      /// 
      /// 
      /// 
      /// 
      public List PermissionList(Guid roleId, int menuId)
      {
       List pmList = new List();
       using (RBACContext connEF = new RBACContext())
       {
        Sys_Role_Model_Permissions srmp = connEF.Sys_Role_Model_Permissions.FirstOrDefault(o => o.ModelID == menuId && o.RoleId == roleId);
        if (srmp != null)
        {
         string permissions = srmp.PermissionIDs;
         if (!string.IsNullOrWhiteSpace(permissions))
         {
          string[] pids = permissions.Split(new char[] { '|' });
          for (int i = 0; i < pids.Length; i++)
          {
           if (!string.IsNullOrWhiteSpace(pids[i]))
           {
            pmList.Add(new PermissionModel() {
             ModelCode = menuId,
             PCode = Convert.ToInt32(pids[i]),
             PName =""
            });
           }
          }
         }
        }
       }
       return pmList;
      }

    最后一个方法中运用到了EF根据菜单以及角色获取某菜单某角色下具有的权限
    前台就非常简单的: 

    @if (ViewBag.IsReportPlan == true)
      {
       @:  
        按钮 
      }

    相关内容

    热门资讯

    空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
    空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
    格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
    空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
    格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
    品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
    空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
    空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
    中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
    中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...