asp.net通用权限设计思想雏形

本文探讨了ASP.NET应用程序的权限设计,包括内外部权限的区分。外部权限侧重于限制匿名用户的访问,通过Global.asax实现。内部权限则细分为模块、页面、数据行、数据列和按钮等五个方面。文章指出,虽然菜单权限未被控制,但没有页面权限的用户无法访问相关页面。模块以文件夹形式组织,所有这些元素形成了一种树状结构,建议使用树形结构表进行管理,以降低耦合并简化维护。

权限说明书

权限主要分为内部外部权限

外部权限就是不让匿名用户登录

这里通过 Global.asax 控制权限,系统权限模块大大降低了耦合,不需要再写在页面基类中

内部权限分为【模块】【页面】【数据行】【数据列】【按钮】【菜单】

这里菜单权限暂时没有控制,就算用户有了菜单,他没有页面权限也进入不了。

这里的模块在系统里面为文件夹,把一个模块放到一个文件夹中。

这里的文件夹、页面、数据行、数据列、按钮关系如下

 

 

这种关系明显是一种树的关系,所以考虑把这种关系放到树形结构表中,便于管理

 

 

 

系统表

        

KC_GetLoseOrders ——【测试表】

 

Sys_Action ——【动作表】 -- 存放动作。如:新增、修改……

 

 

Sys_Catalog ——【系统模块目录表】——用户管理系统模块等

 

 

Sys_JudgeSymbol —— 【配置查询符号】

 

 

 

存放数据列查询条件

Sys_JudgeType ——【系统字段可以操作类型】

 

sysType— 系统类型

FilterId—(Sys_JudgeSymbol —— 【配置查询符号】 ) 的主键

 

这张表说明什么字段可以进行什么操作;如 :int 型可以进行大于等于小于等比较操作,但是一般不会进行包含操作

Sys_Group ——【用户组表】

 

Sys_User ——【用户表】

 

一个用户属于一个用户组

 

 

Sys_GroupPage ——【配置用户组页面】

 

Gid 表示用户组 ID

PID 表示页面 ID ,是 Sys_Catalog 主键

Action ——长度为 1 ,用于存放“ + ”,“ -

这张表主要用于管理用户组的页面。

首页用户组拥有某个模块中所有页面。该表控制该模块减掉某个页面,或增加另一个模块页面

Sys_UserPage ——【配置用户页面】

 

类似用户组页面作用。用于控制单个用户对页面的权限

 

这两张表结合使用,解决如下问题:

1、   用户组拥有某个模块,但是他想拥有其他模块的某个页面

2、   解决了用户角色,如:仓管部门,改部门拥有:仓管部的模块(包含页面: /CangGuan/Default.aspx /CangGuan/NewDemo.aspx /CangGuan/Test.aspx )。比如: /CangGuan/NewDemo.aspx 只可以仓管经理看到。这里我们拥有两种解决方案、第一:在少量用户的情况下我们可以直接设置除了经理以外的所有人 Sys_UserPage 中减掉 /CangGuan/NewDemo.aspx 页面。第二:在用户多的情况下,我们设置 Sys_GroupPage 中减去页面 /CangGuan/NewDemo.aspx 页面。再在经理的 Sys_UserPage 加上该页面

 

Sys_GroupGridColumn ——【用户组列进行新的配置】

 

Gid ——用户组 ID

Cid ——对应系统模块目录表中主键

NewColumns 新列

Sys_UserGridColumn ——【用户组进行新的配置】

用户进入页面之后数据控件显示列权限执行过程:其中 || 代表如果没有就往下执行

        // 查用户列 - Sys_UserGridColumn

                   ||

        // 用户没有列就查用户组列 - Sys_GroupGridColumn

                    | |

        // 用户组没有列就查系统列 - Sys_Catalog

 

Sys_GroupGridRow ——【配置用户组数据行权限】

 

GID— 用户组 ID

CID— 模块目录表 ID 对应的是列

Colname— 列名

FilterId— 过滤符号 ID

ConditionA— 条件 A

ConditionB— 条件 B

Sys_UserGridRow ——【配置用户数据行权限】

用户进入页面之后数据控件显示行权限执行过程:其中 || 代表如果没有就往下执行

// 用户行权限

            //     ||

            // 用户组行权限

 

 

Sys_GroupAction-- 【用户组按钮】

 

GID— 用户组 ID

CID— 系统模块 ID-- 对应的具体动作 ID

NewActCode— 对应的 ActionCode- 用逗号分隔

Descn— 描述 用逗号分隔

Sys_UserAction ——【用户按钮】

 

同上

用户进入页面之后数据控件显示按钮权限执行过程:其中 || 代表如果没有就往下执行

// 个人按钮

     ||

        // 用户组按钮

              ||

        // 系统按钮

 

 

代码页面控制: Global.asax

 

 

    protected void   Application_PreRequestHandlerExecute(object sender, EventArgs e)

    {

        if (Session["pageUrl" ] == null || Session["pageUrl" ].ToString().ToLower() != Request.Url.AbsoluteUri.ToString().ToLower())

        {

            Session["pageUrl" ] = Request.Url.AbsoluteUri.ToString().ToLower();

            Response.Write(" 请求开始 ...<br>" + Guid .NewGuid().ToString());

            Response.Write("<br>pageUrl:" + Session["pageUrl" ].ToString());

            string url = Request.Url.AbsoluteUri.ToString().ToLower();//URL 地址

            string urlBack = Request.CurrentExecutionFilePath;//URL 后面部分

 

            Response.Write("<br> 当前 URL 地址: " + url);

            Response.Write("<br> 当前 urlBack 地址: " + urlBack);

            bool canVistied = false ;

 

            if (Session["page" ] != null )

            {

 

                ArrayList al = Session["page" ] as ArrayList ;

                if (al.Contains(urlBack))

                    canVistied = true ;

 

            }

            else

            {

                Response.Write("<br> 没有得到 session<br>" );

            }

            if (!canVistied && url != "http://10.49.53.14/demo.aspx" )

            // if (!canVistied && url != "http://10.49.53.14/default.aspx")

            {

                Response.Clear();

                Response.Write(" 您无权访问该页面,或页面已过期! " );

                Response.End();

            }

        }

        else

        {

            Response.Write(" 进入 else 【说明不为NULL,并且是同一个URL】 :pageUrl:" + Session["pageUrl" ].ToString());

        }

    }

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值