MVC網站開發(fā)之權限管理篇
一、前言
剛到公司沒多長時間就開始接觸MVC到現(xiàn)在不能說懂了,只能說到達會用這個層次吧,感覺MVC用來寫Web還是很強大的,層次清晰。
今天我來寫寫關于權限管理這一塊,自我感覺網站的權限主要分為菜單權限和角色權限,首先說角色權限,比較簡單不同角色可以看到不同頁面這就是角色權限,菜單權限也可以說是操作權限,就是具體到某一個按鈕,或某一個下拉框的查看權限或使用權限。
二、角色權限
1.用戶角色
首先來角色權限,每個用戶有著多樣不同的角色,一對多的關系。

2.菜單管理
在菜單管理中我們就可以這樣管理,某一菜單,那一角色可以看到就打上√這樣比較容易控制。

3.數(shù)據(jù)庫
再來看數(shù)據(jù)庫中,要有角色的表以及用戶與角色關系表。

再就是角色與菜單的關系表,其中PermissionIDs字段為操作權限以|隔開。


4.用戶登錄
當用戶登錄時我們就可以根據(jù)登陸人的ID取到他的所有角色存到Session中,并根據(jù)登錄人查出相應的菜單。
//角色基本信息
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()方法就是根據(jù)用戶名獲取菜單列表結構,我這里用戶名在數(shù)據(jù)庫中是唯一的,在這里注意一點比較麻煩的是根據(jù)類可以看出菜單是有父菜單子菜單的所以方法中需要有兩個循環(huán)去添加。
三、菜單權限
也就是操作權限,比如某一按鈕的操作權限。首先我們把所有關于按鈕的操作權限存放到一個類中,(有更好的方法請向我推薦謝謝)

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根據(jù)菜單以及角色獲取某菜單某角色下具有的權限
前臺就非常簡單的:
@if (ViewBag.IsReportPlan == true)
{
@:
<a href="#" class="easyui-linkbutton l-btn"
iconcls="icon-add">按鈕</a>
}
四、尾聲
總結一下,就是首先要有一個菜單管理的模塊,它不但可以管理菜單還可以管理菜單中的權限以及每個角色關于菜單的權限,然后就是后臺的控制,上面權限Model中存的權重,指的是每一角色都有權重,每一個用戶都有他的最大權重,根據(jù)這個權重我們就可以做很多條件的控制,簡單的說也是為了方便吧。
第一篇技術文檔,文筆還需要多鍛煉,以后會試著多寫博文,不會寫文檔的碼農不是好程序員。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- IIS7/IIS7.5/IIS8網站目錄執(zhí)行權限設置方法(與IIS6不同)
- Win2008 R2中IIS7.5配置完網站權限不足問題的解決方法
- IIS PHP環(huán)境Temp文件夾的權限問題引起的網站故障
- win2003 IIS虛擬主機網站防木馬、權限設置、安全配置整理
- Apache Wind2003 配置網站目錄權限小結
- ASP.NET MVC5網站開發(fā)之登錄、驗證和注銷管理員篇1(六)
- ASP.NET MVC5網站開發(fā)之實現(xiàn)數(shù)據(jù)存儲層功能(三)
- vs2010制作簡單的asp.net網站
- 如何對ASP.NET網站實現(xiàn)靜態(tài)化
- ASP.NET MVC5網站開發(fā)管理列表、回復及刪除(十三)
相關文章
ajax.net +jquery 無刷新三級聯(lián)動的實例代碼
ajax.net +jquery 無刷新三級聯(lián)動的實例代碼,需要的朋友可以參考一下2013-05-05
gridview+objectdatasource+aspnetpager整合實例
gridview+objectdatasource+aspnetpager整合實例,需要的朋友可以參考一下2013-04-04
aspnetcore 實現(xiàn)簡單的偽靜態(tài)化功能
這篇文章主要介紹了aspnetcore 實現(xiàn)簡單的偽靜態(tài)化功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
asp.net后臺動態(tài)添加JS文件和css文件的引用實現(xiàn)方法
這篇文章主要介紹了asp.net后臺動態(tài)添加JS文件和css文件的引用實現(xiàn)方法,是非常簡單實用的技巧,需要的朋友可以參考下2014-09-09
asp.net性能優(yōu)化之使用Redis緩存(入門)
本文主要介紹了asp.net性能優(yōu)化之使用Redis緩存的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧2017-03-03

