ASP.NET- 简单的权限管理
权限管理是开发信息管理系统中比较重要的一块,如何把权限管理做的更完美,功能更强大,是值得花很多时间去研究的。
这里记录一下自己对权限管理的一个简单认识,可以说是至简单,说不上一个完整的权限管理,更说不上强大。
这里的权限管理,只是根据不同的用户对应的角色,显示不同的菜单,不同的菜单表示用户具备不同的权限!仅此而以!!
实现起来数据库的设计一共需要四张表
用户表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页面加载
<script src="/Js/jquery-1.8.0.min.js" type="text/javascript"></script> <script src="/DTree/dtree.js" type="text/javascript"></script> <link href="/DTree/dtree.css" rel="stylesheet" type="text/css" /> <script src="../Js/Index.Js" type="text/javascript"></script> <script type="text/javascript"> $(function () { LoadPowerMenu('<%= Session["RoleId"] %>'); //LoadPowerMenu(2); }); </script>
用一个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 { /// <summary> /// PowerUser 的摘要说明 /// </summary> 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 ON
go
-- =============================================
-- Author: 陈春晓
-- Create date: 2013-05-13
-- =============================================
ALTER PROCEDURE [dbo].[Proc_GetPwoerMnageMenu]
@roleid INT
AS
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具