最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

权限设计=功能权限+数据权限

来源:动视网 责编:小OO 时间:2025-09-24 23:36:45
文档

权限设计=功能权限+数据权限

网络管理系统-权限管理权限描述为什么要有权限管理权限管理是Web应用项目中比较关键的环节,因为浏览器是每一台计算机都已具备的,如果不建立权限管理系统,那么一个“非法用户”可以轻而易举通过浏览器访问Web应用项目中的所有功能,资源。因此需要权限管理系统进行权限检测,让经过授权的用户可以正常合法的使用已授权的功能,资源,而对那些未授权的非法用户拒之门外。本项目中的权限管理本项目中的权限管理总的可以分为功能管理和资源管理。在这里我定义了以下关系:权限=功能+资源,在后续出现的权限均指代的是功能+资源
推荐度:
导读网络管理系统-权限管理权限描述为什么要有权限管理权限管理是Web应用项目中比较关键的环节,因为浏览器是每一台计算机都已具备的,如果不建立权限管理系统,那么一个“非法用户”可以轻而易举通过浏览器访问Web应用项目中的所有功能,资源。因此需要权限管理系统进行权限检测,让经过授权的用户可以正常合法的使用已授权的功能,资源,而对那些未授权的非法用户拒之门外。本项目中的权限管理本项目中的权限管理总的可以分为功能管理和资源管理。在这里我定义了以下关系:权限=功能+资源,在后续出现的权限均指代的是功能+资源
网络管理系统-权限管理

权限描述

为什么要有权限管理

权限管理是Web应用项目中比较关键的环节,因为浏览器是每一台计算机都已具备的,如果不建立权限管理系统,那么一个“非法用户”可以轻而易举通过浏览器访问Web应用项目中的所有功能,资源。因此需要权限管理系统进行权限检测,让经过授权的用户可以正常合法的使用已授权的功能,资源,而对那些未授权的非法用户拒之门外。

本项目中的权限管理

本项目中的权限管理总的可以分为功能管理和资源管理。在这里我定义了以下关系:

权限=功能+资源,在后续出现的权限均指代的是功能+资源

1.功能管理中的功能体现到本系统中就是对应一个网页(url),或网页中的一个按钮

2.资源管理中的资源就是本系统中需要用权限约束的资源对象,包括链路、节点、设备,事务等信息。

权限设计

名词解释:

a.SystemUsers:系统用户,使用功能,资源的平台用户。

b.Groups:用户组,功能,资源分配的单位与载体。权限不考虑分配给特定的用户而给组。

c.Roles:角色,一定数量的功能的集合。功能分配的单位与载体,目的是隔离系统用户(SystemUsers)与权限功能(FunUrl)的逻辑关系. 

权限系统的核心由以下三部分构成:创造权限,分配权限,使用权限

1)创建权限:分两步,1创建功能;2创建资源

a.创建功能:Creator 创造 功能, Creator 在设计和实现系统时会分析,一个子系统或称为模块,应该有哪些功能,然后将这些功能注册到相应系统模块中,这里实现就是对Url分别注册到FunUrl中

b.创建资源:Creator 创造 资源,Creator 在设计和实现系统时会分析系统中需要被约束的资源有哪些,然后针对每一种资源,都建立一个组,资源关系表。

2)分配权限:分两步,1 功能分配;2 资源分配

a.  功能分配: Administrator创建角色,创建用户组,给用户组分配用户,将用户组与角色关联,然后Administrator将 功能与角色建立关联关系。这样就可以达到功能分配,这些操作都由 Administrator 来完成的。

b.资源分配:Administrator利用组,资源关系表,然后将组和各种资源分别建立关联关系,这样就可以达到资源分配

3)使用权限:SystemUsers使用 Administrator 分配给的权限去使用各个子系统。 

数据库结构设计

权限执行步骤

MSDN说明:ASP.NET 母版页和内容页中的事件

母版页和内容页都可以包含控件的事件处理程序。对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件。控件事件不会从内容页发送到母版页。同样,也不能在内容页中处理来自母版页控件的事件。

在某些情况下,内容页和母版页中会引发相同的事件。例如,两者都引发 Init 和 Load 事件。引发事件的一般规则是初始化事件从最里面的控件向最外面的控件引发,所有其他事件则从最外面的控件向最里面的控件引发。请记住,母版页会合并到内容页中并被视为内容页中的一个控件,这一点十分有用。

下面是母版页与内容页合并后事件的发生顺序:

1.母版页控件 Init 事件。

2.内容控件 Init 事件。

3.母版页 Init 事件。

4.内容页 Init 事件。

5.内容页 Load 事件。

6.母版页 Load 事件。

7.内容控件 Load 事件。

8.内容页 PreRender 事件。

9.母版页 PreRender 事件。

10.母版页控件 PreRender 事件。

11.内容控件 PreRender 事件。

母版页和内容页中的事件顺序对于页面开发人员并不重要。但是,如果您创建的事件处理程序取决于某些事件的可用性,那么您将发现,了解母版页和内容页中的事件顺序很有帮助。

项目步骤说明

1.BaseMasterPage init()//一级验证(登陆,功能url)

2.MasterPage init()//二级验证(功能加载,数据加载)

3.BasePage init()//将加载的数据重新整理为属性,错误日志记录

4.Page init()//页面中的初始化

5.Page Load()

 说明:

页面开始执行时,1.先调用MasterPage  Init(),而

MasterPage Init() 在调用BaseMasterPage Init().

2.调用Page Init(),而 Page Init()在调用BasePage Init()

3.page load()

这样就形成了上面的五步的验证顺序

权限代码实现

第一步:检测登陆和合法Url(BaseMasterPage)

protected void validate()

    {

        String root = ResolveUrl("~");

        root = root.Substring(0, root.Length - 1);//获得网站主目录

        if (object.Equals(null, Session[SessionKeys.UserId]))//登陆检测

        {

            stopCache();

            Response.Write("");           

        }

        else

        {//功能检测

            string url = Request.AppRelativeCurrentExecutionFilePath.TrimStart('~');

            IList funList = FunctionAgent.GetFunIdByUrl(url);

            if (funList.Count == 0)

            {//检测到功能(Url)不存在,给予提示

                Response.Write("");

                Response.End();

            }

            else

            {

                bool status = false;

                foreach (FunurlInfo f in funList)

                {

                    IList RolesId = Session[SessionKeys.RolesId] as IList;//获得角色

                    if (RolesId != null)

                    {//检测是否有访问的权限

                        status = FunctionAgent.EqualByRoleIdAndFunId(RolesId, f.Funid.ToString());

                    }

                    if (status) break;//如果存在就进入访问

                }

                if (!status && Session[SessionKeys.CurrentUrl] != null)

                {//没有权限就不能进入

                    Response.Write("");

                }

                else

                {

                    if (Session[SessionKeys.CurrentUrl] == null)

                    {

                        Response.Redirect("~/Login.aspx");

                    }

                    else

                    {

                        Session[SessionKeys.CurrentUrl] = url;//将当前页面记录下来

                    }

                }

            }

        第二步:加载资源和功能菜单加载(MasterPage)

功能菜单加载:

其中TreeControl为用户控件:

private void BindTree()

    {

        DataSet treeDataSet = null;

        IList roleId = Session[SessionKeys.RolesId] as IList;//获得角色     

        if (roleId != null)

        {

            if (object.Equals(Session[MoudleName], null))

            {

                Session[MoudleName] = FunctionAgent.Get2MenuFunList(roleId, FunId.ToString());

            }

            treeDataSet = Session[MoudleName] as DataSet;

            if (treeDataSet != null)

            {

                addNodes(tv2Menu.Nodes, treeDataSet, FunId);

            }

        }

    }

    private void addNodes(TreeNodeCollection collection,DataSet treeDataSet, int parentNodeID)

    {

        DataRow[] rows = treeDataSet.Tables["menuDataTable"].Select("paranetFunId=" + parentNodeID);//查找当前结点的所有子结点 

        foreach (DataRow row in rows)

        {

            //新建一个临时结点 

            TreeNode node = new TreeNode();            

            node.Value = row["funId"].ToString();

            node.Text = row["urlName"].ToString();

            node.NavigateUrl =row["url"].ToString();

            string pid = row["url"].ToString();

            node.Expanded = true;//默认为展开

            //递归 加入当前结点的子结点  

            addNodes(node.ChildNodes, treeDataSet, int.Parse(row["funId"].ToString()));

            collection.Add(node);//加入到结点集合中 

        }

}

加载资源:

protected override void OnInit(EventArgs e)

    {

        base.OnInit(e);

        if (object.Equals(Session[SessionKeys.NodesId], null))

        {

            IList groupsId = Session[SessionKeys.GroupsId] as IList;

            if (groupsId != null)

            {

                Session[SessionKeys.NodesId] = ResourceAgent.GetNodeIdsByGroupIds(groupsId);//初始化节点资源

                Session[SessionKeys.LinksId] = ResourceAgent.GetLinkIdsByGroupIds(groupsId);//初始化链路资源

                Session[SessionKeys.EquipmentsId] = ResourceAgent.GetEquipmentIdsByGroupIds(groupsId);//初始化设备资源

                Session[SessionKeys.PortsId] = ResourceAgent.GetPortIdsByGroupIds(groupsId);//初始化端口资源

            }

        }

      }

    第三步:将资源转化为属性,和错误记录(BasePage)

    protected override void OnInit(EventArgs e)

    {

        UserId = GetFromSession(SessionKeys.UserId) as string;

        NodesId = GetFromSession(SessionKeys.NodesId) as IList;       

        LinksId=GetFromSession(SessionKeys.LinksId)  as IList;  

        EquipmentsId =GetFromSession(SessionKeys.EquipmentsId)  as IList;

        PortsId =GetFromSession(SessionKeys.PortsId)  as IList;

        TransTypeIds =GetFromSession(SessionKeys.TransTypeIds)  as IList;

        PageName = Request.RawUrl;

        UserIp = Request.UserHostAddress.ToString();         

        base.OnInit(e);

}

protected virtual void ShowMessage(DcException dex) //错误处理

    {

        dex.UserId = UserId;

        dex.PageName = PageName;

        dex.UserIp = UserIp;

        if (string.IsNullOrEmpty(dex.Msg))

        {

            dex.Msg = dex.Message;

        }

        if (dex.ErrorType == MessageType.Warning)

        {

            ShowMessage(dex.Msg);            

        }

        else

        {

            if (dex.Msg.Equals("正在中止线程。") || dex.Msg.Equals("Thread was being aborted."))

            {

                return;

            }

            Log.Error(dex.ToString());//记录错误信息

            //迁移到错误页面

            string errPageUrl = ConfigurationManager.AppSettings["ErrorPageUrl"];

            Dictionary dictError = new Dictionary();

            dictError.Add("ErrorMsg", dex.Msg);

            dictError.Add("PageName", PageName);

            SaveToSession(SessionKeys.ExceptionInfo, dictError);

            Response.Redirect(errPageUrl);

        }

    } 

第四步,第五步:页面初始化数据,进行绑定(资源管理-EditNodeInfo.aspx为例)(Page):

protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {

            try

            {

                IList nodeNameList = EquipmentLevelAgent.GetNode(NodesId);//NodesId为BasePage中的节点资源                

                NodeDropDownList.DataSource = nodeNameList;

                NodeDropDownList.DataTextField = "Name";

                NodeDropDownList.DataValueField = "Id";

                NodeDropDownList.DataBind();

            }

            catch (Exception ex)

            {

                lblMessage.Text = "数据库异常,请稍候再试" + ex.Message;

            }

        }

    }

文档

权限设计=功能权限+数据权限

网络管理系统-权限管理权限描述为什么要有权限管理权限管理是Web应用项目中比较关键的环节,因为浏览器是每一台计算机都已具备的,如果不建立权限管理系统,那么一个“非法用户”可以轻而易举通过浏览器访问Web应用项目中的所有功能,资源。因此需要权限管理系统进行权限检测,让经过授权的用户可以正常合法的使用已授权的功能,资源,而对那些未授权的非法用户拒之门外。本项目中的权限管理本项目中的权限管理总的可以分为功能管理和资源管理。在这里我定义了以下关系:权限=功能+资源,在后续出现的权限均指代的是功能+资源
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top