答应了客户写一个控制数据列的访问控制程序,虽然已经到了深夜1点多了,还是硬着头皮把程序都调整好,文档都写好,明天客户上班了,就可以看到例子程序了,希望能满足客户的实际需要。

 

 其实权限的存储,看透了,也是很简单的事情,就是 “什么对象对什么资源有什么权限?”把这个逻辑关系能保存好就ok了,你这样设计了,别人也容易阅读你的程序,容易理解你的数据库设计,将来也容易维护一些。

   用一个思想,前后不矛盾的,把整个系统实现出来,也有些不容易,很多环节会出现前后矛盾,思路混乱的情况,所以时刻要提醒自己,自己的权限系统是按“什么对象对什么资源有什么权限?”的指导思想设计的,若有违背了这个思想,那就仔细深入思考,再重新整理思路。

 

什么对象:在系统里确定各种对象的唯一性,需要2个参数,一个是对象的类别,一个是对象的主键,就像是ERP里的入库单(单号)。

什么资源:什么资源,也是一样的,也需要一个分类,一个主键来识别资源的唯一性。

什么权限:最简单的做法,就是有一个权限表,只用主键来识别唯一性,而不是用“哪个模块+哪个功能”来识别权限,那样做过于繁琐了,将来的扩展性、可维护性都会很差一些,不能灵活适应各种复杂的情况。

 

那表格列的控制,也是一样的道理,应该有一个权限定义,这个权限叫“表格列访问控制”,什么对象是指用户还是角色,对什么资源是指各个表的列。

 

那有一个问题需要解决:这么多表,都有哪些字段?若都靠人工输入,那真的是搞死人,不准确不说,需要反复输入,反复维护,除非有超级耐心,否则难做到准确性、高效性;解决问题的思路是:“我们不是设计了详细的PowerDesigner数据模型吗?不仅仅拿这个生成代码,还可以生成数据表字段的说明文档

 

1:首先需要定义一个权限,这个权限叫“表格列访问控制”。

 

2:我们在PowerDesigner里辛苦设计了表的结构,各个字段的注释等,那先有设计后有实现的原理,数据库里都有什么表、什么字段,应该能从这个设计里自动生成,而不是要人工再输入数据。

 

3:那我们重复利用这个良好的设计,改进一下代码生成,让代码生成器自动生成这些表的,字段说明。

 

4:那我们运行一下这些能自动经产生好表结构说明的程序,那我们就可以得到设置里的内容了。

代码
         ///   <summary>
        
///  自动生成设置表字段
        
///   </summary>
         private   void  SetTableColumns()
        {
            
this .UserCenterDbHelper.Open();
            BaseRoleManager roleManager 
=   new  BaseRoleManager( this .UserCenterDbHelper,  this .UserInfo);
            roleManager.SetTableColumns();

            BaseUserManager userManager 
=   new  BaseUserManager( this .UserCenterDbHelper,  this .UserInfo);
            userManager.SetTableColumns();

            BaseStaffManager staffManager 
=   new  BaseStaffManager( this .UserCenterDbHelper,  this .UserInfo);
            staffManager.SetTableColumns();

            BaseModuleManager moduleManager 
=   new  BaseModuleManager( this .UserCenterDbHelper,  this .UserInfo);
            moduleManager.SetTableColumns();

            
this .UserCenterDbHelper.Close();
        }

 

5:那运行好后,数据库里,就会有表结构的字段说明数据(这些都是代码自动生成的,靠人工输入会搞死人的,表结构有变化了,重新运行一次就OK了,省事了,彻底可以做到全自动化了,爽啊)。

 

6:在运行权限设置页面,用户、角色的字段访问权限可以进行设置了。

 

7:设置用户的字段访问权限效果图如下:

 

8:在没控制表格列的访问控制时,运行效果如下:

 

9:按权限控制后,显示出来的表格为,没有允许访问的字段,不是公开的字段,就无法看到了,都被隐藏掉了:

 

10:数据列的权限控制代码如下参考:

代码
// ------------------------------------------------------------
//  All Rights Reserved , Copyright (C) 2010 , Jirisoft , Ltd. 
// ------------------------------------------------------------

using  System;
using  System.Data;
using  System.Web.UI.WebControls;

namespace  DotNet.Web.Permission
{
    
using  DotNet.Business;
    
using  DotNet.Manager;
    
using  DotNet.Utilities;

    
///   <remarks>
    
///  TableColumns
    
///  表字段权限的例子
    
///  
    
///  修改纪录
    
///  
    
///     版本:1.0 2010.07.13    JiRiGaLa    写好例子程序方便别人学习。
    
///     
    
///  版本:1.0
    
///  
    
///   <author>
    
///          <name> JiRiGaLa </name>
    
///          <date> 2010.07.13 </date>
    
///   </author>  
    
///   </remarks>
     public   partial   class  TableColumns : BasePage
    {
        
protected   void  Page_Load( object  sender, EventArgs e)
        {
            
//  当然是用户需要登录,否则哪里能知道,现在是判断谁的权限啊?
             this .UserInfo  =  Utilities.Login( " Jirigala_Bao@Hotmail.com " , String.Empty);
            
//  设置表字段
            
//  this.SetTableColumns();

            
//  先设置表格的字段状态
             this .CheckUserTableColumnsPermission();
            
//  显示用户
             this .GeUserList();
        }

        
///   <summary>
        
///  自动生成设置表字段
        
///   </summary>
         private   void  SetTableColumns()
        {
            
this .UserCenterDbHelper.Open();
            BaseRoleManager roleManager 
=   new  BaseRoleManager( this .UserCenterDbHelper,  this .UserInfo);
            roleManager.SetTableColumns();

            BaseUserManager userManager 
=   new  BaseUserManager( this .UserCenterDbHelper,  this .UserInfo);
            userManager.SetTableColumns();

            BaseStaffManager staffManager 
=   new  BaseStaffManager( this .UserCenterDbHelper,  this .UserInfo);
            staffManager.SetTableColumns();

            BaseModuleManager moduleManager 
=   new  BaseModuleManager( this .UserCenterDbHelper,  this .UserInfo);
            moduleManager.SetTableColumns();

            
this .UserCenterDbHelper.Close();
        }

        
private   void  GeUserList()
        {
            
//  获取用户列表
            BaseUserManager userManager  =   new  BaseUserManager();
            DataTable dataTable 
=  userManager.GetDT();
            
this .grvUser.DataSource  =  dataTable;
            
this .grvUser.DataBind();
        }

        
private   void  CheckUserTableColumnsPermission()
        {
            
//  当前用户能访问那些字段?
             this .UserCenterDbHelper.Open();
            BaseTableColumnsManager tableColumnsManager 
=   new  BaseTableColumnsManager( this .UserCenterDbHelper, UserInfo);
            DataTable dataTable 
=  tableColumnsManager.GetTableColumns( this .UserInfo.Id,  " Base_User " );
            
this .UserCenterDbHelper.Close();

            
for  ( int  i  =   0 ; i  <   this .grvUser.Columns.Count; i ++ )
            {
                
if  ( this .grvUser.Columns[i]  is  BoundField)
                {
                    BoundField boundField 
=  (BoundField) this .grvUser.Columns[i];
                    
//  这个字段是否可以查看?
                    boundField.Visible  =  BaseBusinessLogic.Exists(dataTable, BaseTableColumnsTable.FieldColumnCode, boundField.DataField);
                }
            }
        }
    }
}

 

 

 

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。

About

吉日嘎拉可爱的女儿

吉日嘎拉(蒙古语为吉祥如意),2000年毕业于黑龙江大学计算机系软件专业,目前定居杭州,典型的IT软件土鳖一个,外号“软件包工头”。

 

通用权限管理系统组件(GPM - General Permissions Manager)自2003年开始发布,目前是国内注册用户和免费盗版用户最多的权限管理系统,是各种信息管理系统开发中彻底的权限解决方案。本组件支持多种主流数据库(Oracle、sqlsever、db2、mysql),功能强大,使用方便,代码简洁,思路严谨,被广大支持者称为权限管理系统中的“走火入魔级权限管理系统”。

 

精心维护通用权限管理系统组件(GPM - General Permissions Manager)有8年多,3年的不断推广,20万行经典的业务逻辑积累,经过上万次的调试修正,经历了四百个付费客户,上百软件公司的实战开发。

11年以上开发经验,外企工作5年,上市公司3年,独立经营软件公司2年,主持研发部门管理工作4年以上。

将权限管理、工作流做到我能力的极致,一个人只能做好那么很少的几件事情。

吉日嘎拉,通用权限管理系统组件
QQ:252056973,Mail:jirigala_bao@hotmail.com

访问者分布 Locations of visitors to this page

通用权限管理模块的严谨设计定位、精心编码实现、不断维护推广、持续优化改进,主要是为了实现一个可以高度重复利用劳动成果的工具软件并×××给所需的人们,另想成为国人值得骄傲的知名软件功能模块。

可供国内管理类开发人员在日常工作中进行灵活二次开发利用的模块,开发管理类软件的必备工具之一,我们的目标就是让程序员早点儿回家休息。

淘宝店地址:http://jirigala.taobao.com