如今只是打算作一個最簡單的權限管理只涉及頁面權限不設置數據權限或者操做權限(四張表解決問題)數據庫
可擴展性稍微高點 要加數據權限或者操做權限何嘗也不是不能夠,看我的吧 我纔開始可能想的不是那麼數據庫設計
全面,歡迎大佬拍磚帶帶我這個菜雞~ide
廢話很少說直接上代碼ui
1.SQL結構url
create database QXDBTest go use QXDBTest go create table UserInfo( id int primary key identity(1,1),--主鍵 name varchar(50),--名稱 zid int not null --職位ID ) --職位表 create table ZwInfo( zid int primary key identity(1,1),--職位ID 對應用戶 zname varchar(50) ) --菜單表 create table Menu( menuid int primary key identity(1,1), --菜單ID menuname varchar(50), --菜單名稱 menuurl varchar(200)--菜單路徑 ) --權限表 create table QxInfo( qxid int primary key identity(1,1), --主鍵 qxname varchar(200),--主鍵名稱 Menuid int, --菜單Id zid int --職位Id )
不要在乎命名啦,我只是作了一個demo 到時候放到項目上的時候會正規的啊哈哈spa
基本邏輯就是權限表去查詢對應的ID有哪些菜單ID 再去根據菜單ID去判斷哪些頁面是能夠訪問的哪些頁面是不能夠訪問的設計
不過我剛纔看了下還有更方便的方法如今這個初版就是這麼作的了,只要數據庫設計好了 代碼運行起來就簡單了不少了code
廢話很少說接着看代碼;blog
首先建立HomeController 先寫個登陸字符串
[HttpPost] public JsonResult Index(string name) { QXDBTestEntities _db = new QXDBTestEntities(); try { var list = _db.UserInfo.Where(p => p.name == name).ToList(); if (list.Count > 0) { Session["User"] = list; return Json("ok"); } else { return Json("No"); } } catch (Exception ex) { throw ex; } }
我作了個簡單的只有用戶名到時候有要設計的能夠酌情添加本身須要的參數很少贅述了~
而後建立BaseController 重寫 Initialize 方法~上代碼
protected override void Initialize(RequestContext requestContext) { //這個Session存儲的是用戶信息(泛型) if (requestContext.HttpContext.Session["User"] != null) { try { //獲取list List<UserInfo> li = (List<UserInfo>)requestContext.HttpContext.Session["User"]; if (li.Count > 0) { //拼接獲取控制器加視圖的地址 Dictionary<string, object>.ValueCollection list = requestContext.RouteData.Values.Values; var pp = list.ToArray(); //拼接字符串 string str = "/" + pp[0] + "/" + pp[1]; //根據zid 去查詢權限表 QXDBTestEntities _db = new QXDBTestEntities(); int id = li[0].zid; List<QxInfo> qxlist = _db.QxInfo.Where(p => p.zid == id).ToList(); List<Menu> menulist = new List<Menu>(); //獲取權限ID 根據權限ID 查詢到底有哪些頁面能夠訪問 for (int i = 0; i < qxlist.Count; i++) { int id1 = Convert.ToInt32(qxlist[i].Menuid); List<Menu> me = _db.Menu.Where(z => z.menuid == id1).ToList(); if (me.Count > 0) { menulist.Add(me.FirstOrDefault()); } } if (menulist.Exists(pz => pz.menuurl == str)) { base.Initialize(requestContext); } else { requestContext.HttpContext.Session["User"] = null; requestContext.HttpContext.Response.Redirect("/Home/Wqcz"); } } } catch (Exception ex) { throw ex; } } else { base.Initialize(requestContext); } }
基本大功告成 我隨便輸入一些數據看看
基本已經成型了 到時候就是集成項目了