权限说明书
权限主要分为内部外部权限
外部权限就是不让匿名用户登录
这里通过 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()); } } |
|
|