权限管理是开发信息管理系统中比较重要的一块,如何把权限管理做的更完美,功能更强大,是值得花很多时间去研究的。
这里记录一下自己对权限管理的一个简单认识,可以说是至简单,说不上一个完整的权限管理,更说不上强大。 这里的权限管理,只是根据不同的用户对应的角色,显示不同的菜单,不同的菜单表示用户具备不同的权限!仅此而以!!实现起来数据库的设计一共需要四张表
用户表Users id userName passWord roleId 1 ccx 123456 1 2 zxm 123456 2角色表Roles
id roleName 1 系统管理员 2 普通用户菜单表Menus
id pid name url 1 0 新闻中心 NULL 2 1 娱乐新闻 news.aspx 3 1 China新闻 chinaNews.aspx 4 0 生活 NULL 5 4 彩票购买 buycp.aspx 6 4 电影票 movie.aspx 7 6 娱乐电影票 ylmovie.aspx 8 6 武打电影票 wdmovie.aspx角色菜单表RolesMenu
id roleId menuId 1 1 1 2 1 2 3 2 1 4 1 3 5 1 4 6 1 5 7 1 6 8 1 7 9 1 8 实现的原理很简单:首先在登陆的时候对Users表进行操作,判断用户是否存在,如果存在通过Session将对应用户的roleId值保存起来,然后跳转到登陆主界面接着在登陆主界面中操作RolesMenu表,通过左关联将Roles表和Menus表与RolesMenu关联起来,并根据roleId值过滤,找出当角色所对应的菜单 这里用到了一个JS插件DTREE,来显示一下树状的结果。下面直接贴代码LOGIN.ASPX登陆用:
protected void btnLogin_Click(object sender, EventArgs e) { string userName = txtUserName.Text; string passWord = txtPassWord.Text; PowerControl.BLL.Users users = new BLL.Users(); if (users.Exists(userName, passWord)) { Model.Users u = users.GetModel(userName); Session["UserName"] = u; Session["RoleId"] = u.roleId; Response.Redirect("Index.aspx"); } else { LitMsg.Text = "不存在!!"; } }
Index.Js页面,用于结合DTree页面显示成树状
function LoadPowerMenu(roleId) { $.post("/Service/PowerUser.ashx?roleId=" + roleId, function (data) { var JsonData = $.parseJSON(data); mytree = new dTree('mytree', 'MenuPageCall'); //mytree.config.closeSameLevel = true; //mytree.config.useCookies = false; mytree.add('root', -1, '系统管理'); mytree.openAll(); for (var i = 0; i < JsonData.length; i++) { var id = JsonData[i].id; var parentId = JsonData[i].pId; var menuName = JsonData[i].name; var menuURL = JsonData[i].url; if (parentId == 0) { mytree.add(id, 'root', menuName, menuURL, "mainFrame", "mainFrame"); } else { mytree.add(id, parentId, menuName, menuURL, "mainFrame", "mainFrame"); } } document.getElementById("divMenu").innerHTML = mytree; });}
Inde.aspx页面加载
用一个Handler获取对角色所要的所对应的菜单
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data;using System.Web.Script.Serialization;using System.Text;using PowerControl.Common;namespace PowerControl.Service{ ////// PowerUser 的摘要说明 /// public class PowerUser : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; int roleId = Convert.ToInt32(context.Request["roleId"].ToString()); PowerControl.BLL.RolesMenu rMenuBll = new BLL.RolesMenu(); DataSet ds = rMenuBll.GetMenuListByRoleId(roleId); string strJson = ConvertJson.ToJson(ds.Tables[0]); context.Response.Write(strJson); } public bool IsReusable { get { return false; } } }}
最后存储过程:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ONgo -- =============================================-- Author: 陈春晓-- Create date: 2013-05-13-- =============================================ALTER PROCEDURE [dbo].[Proc_GetPwoerMnageMenu] @roleid INTAS BEGIN SELECT m.* FROM rolesmenu rm LEFT JOIN roles r ON rm.roleid = r.id LEFT JOIN menu m ON rm.menuid = m.id WHERE r.id = @roleid END