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


 

posted @ 2013-05-15 16:48  春天又来了  阅读(930)  评论(0编辑  收藏  举报