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