我現在是這樣做的:一個權限表,保存窗體、按鈕、字段的權限,結構是
用戶、功能項(窗體、按鈕、字段的名字)、權限類型(int類型,窗體和按鈕隻有兩種權限類型:允許、拒絕。
字段有三種權限類型:隻讀、無權、可寫)
界面的代碼如下:“新增”按鈕的權限
- C# code
//用戶在某個窗體的權限列表。key為功能項名,如按鈕名稱。value為權限類型 Hashtable hash = ttaad431mgr.GetHashtableByID(str_usid, this.Name); bool auth_AddNew = false; if (hash.Contains("btnAddNew")) { int int_AddNew = (int)hash["btnAddNew"]; if (int_AddNew == (int)Common.PermisionFuntEnum.Permit) { auth_AddNew = true; } } //IsEdit 是否編輯狀態 btnAddNew.Enabled = IsEdit ? false : auth_AddNew;
下面是字段的權限:
- C# code
int auth_nama = (int)Common.PermisionFildEnum.Reject; if (hash.Contains("nama")) { auth_nama = (int)hash["nama"]; } labnama.Tag = auth_nama;//標簽保存權限類型,“復制”中使用 if (auth_nama == (int)Common.PermisionFildEnum.ReadOnly) { txtnama.PasswordChar = Convert.ToChar(0); txtnama.Enabled = true; txtnama.ReadOnly = true; } else if (auth_nama == (int)Common.PermisionFildEnum.Reject) { txtnama.PasswordChar = ' '; txtnama.Enabled = false; } else { txtnama.PasswordChar = Convert.ToChar(0); txtnama.Enabled = true; txtnama.ReadOnly = !IsEdit; }
------解决方案--------------------------------------------------------
这个权限控制很好.但是还是存在一些问题,最大的问题就是不灵活,楼主应该能体会到.
1.可以把一些功能宏观化,这样就可以找出规律.例如增 删 改 查,这些都是可以归结到页面级,是否具有对A页面的浏览权限,如果有,那么是否有对数据的增 删 改 查等权限.等等.
2.当然,对于个别特殊功能,是无法抽象出规律的,这个时候就要细化,而不论怎么细化都离不开增 删 改 查这些基本概念.具体功能具体做,这样的特出权限控制的地方应该不多.
3.关于表的设计.这点可以说是最重要的.但是以目前楼主的设计来看,可扩展性几乎没有.主要的原因就是多用户问题,既然有权限控制,那么肯定是牵扯到多用户的.不同的用户对某个功能具有不同的权限,相同级别的用户对某个相同的功能也可能具有不同的权限,这些控制都是相当复杂的.而主要只能归结到表的设计问题上.
这里可以设计表的关联,以数字映射编码的方式减少查询次数以及表的记录数.例如,可以添加一个权限字段,用来保存权限每个页面的权限编码,每个页面作为一条记录.
1,1111 2,0001 例如这个编码,我们可以翻译成,级别为1的用户具有对这个页面的增 删 改 查权限.级别为2的用户具有对这个页面的查看权限.
不多废话了,这个权限的问题,有些复杂,我只能说说自己的观点,具体设计还是要看楼楼主的.主要就是可扩展性.
------解决方案--------------------------------------------------------
早5年前,我就这样用了。用下来感觉还不错,一般的最多的需要后期自定义的权限控制是字段,其他的按钮什么的可以再代码中写死。你可以这样设计权限:
菜单项-->模块
菜单项里面就定义对该模块(对应表的录入界面)的字段的权限(可看、可改、不可见)