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

    技术2024-04-14  10

    权限说明书

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

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

    这里通过 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());

            }

        }

     

     

     

    最新回复(0)