分享

博客园 - zhuweisky - 将权限引入系统的探索

 昵称4p5UN 2006-04-10

将权限引入系统的探索

Posted on 2006-04-08 22:39 zhuweisky 阅读(573) 评论(4)  编辑 收藏 收藏至365Key 所属分类: WebForm
    很久以前就尝试过使用AOP进行权限控制的管理,那时候只是试试而已,并没有在项目中应用过,最近跟的一个B/S项目中要求我们把权限管理加进去,于是我考虑以前的AOP方法是否真的可行。思考许久后的结果是,可行,但是太麻烦。
    主要原因在于需要在UI层<=>逻辑层<=>数据层之外增加额外的一层来使得AOP拦截可以以恰当的粒度、恰当的时机切入。如果不增加额外的这一层而使用AOP就可能会得到这样的结果--比如,在业务逻辑层或数据层使用AOP切入,就有可能出现这样的情形,用户花了老大的劲将要录入的信息敲入了,最后当点击“提交”时,系统却提示说“你没有权限进行添加操作!”。如果你是这个用户,你一定会郁闷得吐血!
    所以,如果系统不允许用户添加,则根本就不应该让添加的Page或Form出现在用户眼前,然而,这在逻辑层或数据层是无法获取这个信息的,只有UI层知道这是发生在什么时刻。但是,在UI层使用AOP截获,你看见过么?我没有,我相信那不是一件容易做的工作。

    于是,我开始寻找AOP之外的方法,终于,我找到了一个自己还比较满意的解决方案。下面我们以B/S系统为例,来详细描述这个方案,如果是C/S系统,可以类推之。
    为了构建一个在不同B/S系统中可以复用的解决方案,我们需要规范化(定义)一些基础设施或元素。首先,我们需要定义权限的类别,比如最常见的有浏览、添加、修改、删除。你也许已经想到使用一个枚举就可以了。但是,不能使用枚举,因为枚举是sealed,不能被继承,这就意味着权限类别将不能被自定义扩展,所以,我没有使用enum,而是使用class。
    /// <summary>
    
/// 应用可以扩展PermissionType,以增加其它权限类别,比如审核等
    
/// 自定义类别取值应大于 5 
    
/// </summary
    public class PermissionType
    {
        
public const int Browse = 1 ; 
        
public const int Add    = 2 ;
        
public const int Update = 3 ;
        
public const int Delete = 4 ;
    }
     这样,如果具体应用中有更多的权限类别,只要从PermissionType继承即可。比如,应用中需要添加“审核”、“消审”的权限,则可以
    public class MGPPermissionType : PermissionType
    {
        
public const int Audit = 10 ;       //审核
        public const int CancelAudit = 11 ; //消审
    }
 
    一个用户所拥有的权限可以使用IPermission接库进行规范:
    /// <summary>
    
/// 应用可以扩展IPermission,以增加其它权限类别,比如审核等
    
/// </summary>
    public interface IPermission
    {
        
bool CanBrowse{get ;} 
        
bool CanAdd{get ;}
        
bool CanUpdate{get ;} 
        
bool CanDelete{get ;}
    }
    如果应用需要增加别的权限,也可以在实现这个接口的类中进行扩展,比如

    #region GeneralPermission
    
public class GeneralPermission :IPermission
    {
        
public bool HasNonePermit
        {
            
get
            {
                
return ! (CanBrowse || CanAdd || CanUpdate || CanDelete || CanAudit || CanCancelAudit) ;
            }
        }

        
#region IPermission 成员
        
#region CanBrowse
        
private bool canBrowse = false ; 
        
public bool CanBrowse
        {
            
get
            {
                
return this.canBrowse ;
            }
            
set
            {
                
this.canBrowse = value ;
            }
        }
        
#endregion
        
        
#region CanAdd
        
private bool canAdd = false ; 
        
public bool CanAdd
        {
            
get
            {
                
return this.canAdd ;
            }
            
set
            {
                
this.canAdd = value ;
            }
        }
        
#endregion
        
        
#region CanUpdate
        
private bool canUpdate = false ; 
        
public bool CanUpdate
        {
            
get
            {
                
return this.canUpdate ;
            }
            
set
            {
                
this.canUpdate = value ;
            }
        }
        
#endregion
        
        
#region CanDelete
        
private bool canDelete = false ; 
        
public bool CanDelete
        {
            
get
            {
                
return this.canDelete ;
            }
            
set
            {
                
this.canDelete = value ;
            }
        }
        
#endregion
        
        
#region CanAudit
        
private bool canAudit = false ; 
        
public bool CanAudit
        {
            
get
            {
                
return this.canAudit ;
            }
            
set
            {
                
this.canAudit = value ;
            }
        }
        
#endregion
        
        
#region CanCancelAudit
        
private bool

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多