MVC网站开发之权限管理篇

 更新时间:2021年9月22日 10:06  点击:2073

一、前言

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

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

二、角色权限

1.用户角色

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

2.菜单管理

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

3.数据库

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

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

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

前台代码:

 <div data-options="region:'west',split:true" title="导航菜单" style="width: 200px; padding1: 1px;
 overflow: hidden;" id="left_nav">
 <div class="easyui-accordion" data-options="fit:true,border:false">
  @H9C.PMS.BLL.LogOn.MenuList.GetMenu(ViewBag.UserName)
 </div>
</div>

控制器: 

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 "<div>没有可用菜单</div>";
   }
   List<MenuStructure> list = menuStruc.Children.Where(m => m.ParentID == menuCode).ToList();
   StringBuilder sbMenu = new StringBuilder();

   foreach (var item in list)
   {
    if (item.ParentID == "0")
    {
     sbMenu.Append("<div title=\"" + item.Title + "\" style=\"overflow: auto;\">");
     sbMenu.Append("<ul id=\"menu" + item.ParentID + "\" class=\"easyui-tree\" animate=\"true\" dnd=\"true\">");
     sbMenu.Append("<li>");

    }
    else
    {
     sbMenu.Append("<ul id=\"menu" + item.ParentID + "\" class=\"easyui-tree\" animate=\"true\" dnd=\"true\">");
     if (item.Children.Count == 0)
     {
      sbMenu.Append("<li>");
     }
     else
     {
      sbMenu.Append("<li state=\"closed\">");
     }
    }

    sbMenu.Append("<span>");

    if (item.Url == "/")
    {
     sbMenu.Append("<a class=\"e-submenu\" href=\"javascript:void(0);\" title=\"" + item.Title + "\" >");
    }
    else
    {
     string tabsIcon = "14";
     if (!string.IsNullOrWhiteSpace(item.Icon))
     {
      tabsIcon = item.Icon.Replace("/Content/images/", "").Replace(".png", "");
     }
     sbMenu.Append("<a class=\"e-submenu\" href=\"#\" onclick=\"addTab('" + item.Url + "','" + item.Title + "')\" >");
     sbMenu.Append("<img src=\"" + item.Icon + "\" >");
    }

    sbMenu.Append("" + item.Title + "");
    sbMenu.Append("</a></span>");
    if (IsExistParent(item.ModelCode, item))
    {
     sbMenu.Append(MenuNav(item.ModelCode, item));
    }
    sbMenu.Append("</li>");
    sbMenu.Append("</ul>");


    if (item.ParentID == "0")
    {
     sbMenu.Append("</div>");
    }

   }
   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<MenuStructure> Children = new List<MenuStructure>();
 }

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

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

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

/// <summary>
  /// 判断某权限是否在获取某角色权限的列表中
  /// </summary>
  /// <param name="roleId"></param>
  /// <param name="modelCode"></param>
  /// <param name="userSessionModel"></param>
  /// <param name="permissionCode"></param>
  /// <returns></returns>
  public bool IsRoleHavePermissions(Guid roleId, int modelCode, UserSessionModel userSessionModel, int permissionCode)
  {
   List<PermissionModel> permissionModelList = this.GetRolePermissionList(roleId, modelCode, userSessionModel);
   if (permissionModelList == null)
   {
    return false;
   }
   foreach (var o in permissionModelList)
   {
    if (o.PCode == permissionCode)
    {
     return true;
    }
   }
   return false;
  }

/// <summary>
  /// 获取某角色权限的列表
  /// </summary>
  /// <param name="roleId"></param>
  /// <param name="modelCode"></param>
  /// <param name="userSessionModel"></param>
  /// <returns></returns>
  public List<PermissionModel> GetRolePermissionList(Guid roleId, int modelCode, UserSessionModel userSessionModel)
  {
   foreach (var o in userSessionModel.RoleList)
   {
    if (o.RoleID == roleId)
    {
     List<Model.RBAC.PermissionModel> permissionList = this.PermissionList(roleId, modelCode);
     return permissionList;
    }
   }
   return null;
  }

/// <summary>
  /// 获取某菜单某角色下具有的权限
  /// </summary>
  /// <param name="modelId"></param>
  /// <param name="menuId"></param>
  /// <returns></returns>
  public List<PermissionModel> PermissionList(Guid roleId, int menuId)
  {
   List<PermissionModel> pmList = new List<PermissionModel>();
   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)
  {
   @:&nbsp;&nbsp;
    <a href="#" class="easyui-linkbutton l-btn"
     iconcls="icon-add">按钮</a> 
  } 

四、尾声 

总结一下,就是首先要有一个菜单管理的模块,它不但可以管理菜单还可以管理菜单中的权限以及每个角色关于菜单的权限,然后就是后台的控制,上面权限Model中存的权重,指的是每一角色都有权重,每一个用户都有他的最大权重,根据这个权重我们就可以做很多条件的控制,简单的说也是为了方便吧。
第一篇技术文档,文笔还需要多锻炼,以后会试着多写博文,不会写文档的码农不是好程序员。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • 如何获取网站icon有哪些可行的方法

    获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon,所以此方法很多情况都不可用。 更好的办法是通过google提供的服务来实现:http://www.google.com/s2/favi...2014-06-07
  • mac下Apache + MySql + PHP搭建网站开发环境

    首先为什不自己分别搭建Apache,PHP和MySql的环境呢?这样自己可以了解更多知识,说起来也更酷。可也许因为我懒吧,我是那种“既然有现成的,用就是了”的人。君子生非异也,善假于物也。两千年前的荀子就教导我们,要善于利用工具...2014-06-07
  • php实现网站留言板功能

    我要实现的就是下图的这种样式,可参考下面这两个网站的留言板,他们的实现原理都是一样的畅言留言板样式:网易跟帖样式:原理 需要在评论表添加两个主要字段 id 和 pid ,其他字段随意添加,比如文章id、回复时间、回复内容、...2015-11-08
  • 浅谈关于如何检测iOS14本地网络权限的一些思路

    这篇文章主要介绍了浅谈关于如何检测iOS14本地网络权限的一些思路,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • phpMyadmin创建数据库和设置用户权限图解

    phpmyadmin是一款很不错的WEB对mysql数据库管理软件,如果你想创建数据库与设置用户权限我们必须操作用户的很高的权限,如ROOT权限,下面我来给大家介绍介绍。 先来配...2016-11-25
  • SpringMVC文件上传原理及实现过程解析

    这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
  • 网站广告怎么投放最好?首屏广告投放类型优化和广告位布局优化的案例

    网站广告怎么投放最好?一个网站中广告位置最好的是哪几个地方呢,许多的朋友都不知道如何让自己的网站广告收效最好了,今天我们就一起来看看吧。 在说到联盟优化前,...2016-10-10
  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25
  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16
  • C#判断程序是否是管理员权限运行的方法代码示例

    这篇文章主要介绍了C#判断程序是否是管理员权限运行的方法代码示例,本文直接给出实现代码例子,需要的朋友可以参考下...2020-06-25
  • SpringMvc自动装箱及GET请求参数原理解析

    这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • SpringMvc获取请求头请求体消息过程解析

    这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
  • Springmvc ResponseBody响应json数据实现过程

    这篇文章主要介绍了Springmvc ResponseBody响应json数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-26
  • Java类的访问权限关键字用法说明

    这篇文章主要介绍了Java类的访问权限关键字用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-29
  • 个人站长做网站应该考虑的一些问题

    个人网站建设应该考虑哪些问题呢?这个问题我们先在这里不说,下文会一一列出来,希望这些建义能帮助到各位同学哦。 我相信VIP成员里面有很多站长,每个人几乎都拥有一个...2016-10-10
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

    本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25
  • Postgres 创建Role并赋予权限的操作

    这篇文章主要介绍了 Postgres 创建Role并赋予权限的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-16
  • MySQL验证用户权限的方法

    知识归纳因为MySQL是使用User和Host两个字段来确定用户身份的,这样就带来一个问题,就是一个客户端到底属于哪个host。 如果一个客户端同时匹配几个Host,对用户的确定将按照下面的优先级来排 基本观点越精确的匹配越优先...2015-11-08
  • 理解javascript中的MVC模式

    这篇文章主要为大家介绍了javascript中的MVC模式,MVC是一种软件架构模式,一般把软件模式分为三部分,本文就针对MVC模式的三部分进行讲解,感兴趣的小伙伴们可以参考一下...2016-02-01
  • Postgresql 数据库权限功能的使用总结

    这篇文章主要介绍了Postgresql 数据库权限功能的使用总结,具有很好的参考价值,对大家有所帮助。一起跟随小编过来看看吧...2021-02-05