推荐.NET教程: ASP.NET C# 开发环境 Ajax教程 控件开发 统计报表 数据库 Web服务 安装部署 CommunityServer NHibernate DataGrid/GridView 实用代码 VS2005
示例源码 MVC/三层 SqlHelper 入门源码 开源 CMS Ajax/Atlas C#.net 毕业设计 源码 经典代码 商业 本站作品 持久层 随书源码 WebService 英文/汉化 Asp.net2.0

阿牛·乐园

每天进步一点点

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  71 随笔 :: 14 文章 :: 378 评论 :: 13 引用
     如果一个系统需要很灵活的权限系统,我们一般会采用RBAC(基于角色的操作控制).我对此的理解,按照UML用例图,可以把分离出资料和操作两个元素,再加上角色.RBAC的东西就齐了.
    关于RBAC的数据库设计以及代码的书写,本文不想论述,我这里只想谈一下,如何在代码的基础上,更好的使用它.
     在使用时,我们要把每个UI控件的事件,如Button.Click事件和一个对资源的操作绑定起来,这样,在我们点击按钮时,通过一定的方法,我们去验证该用户(角色)是否对指定的资源有指定的操作权限,从而做出判断. 而这个一定的方法,我想到两种:
    一. 通过代码直接在事件中写,如
   
protected void btnDelete_Click()
{
    
if(!xx.HaveRight("user","delete"))
    
{
       
throw new RbacNoRightException()
    }

    
else
    
{
        
/// code here
    }

}
但是这种方式,个人感觉把 "user","delete"这两种东西写死在代码里面了,不是很好.以后要是有什么改动,还得重新编译程序集.
     二. 通过继承重写 Button,注册 Button.Click事件,控制先执行我拉的委托函数A,在这个函数中,来判断权限.
示例代码如下:
    public class RbacButton : System.Web.UI.WebControls.Button, IRbacControl
    
{
        
protected override void OnInit(EventArgs e)
        
{
            
this.Click += new EventHandler(RbacButton_Click);
            
this.Command += new CommandEventHandler(RbacButton_Command);

            
base.OnInit(e);

        }


        
void RbacButton_Command(object sender, CommandEventArgs e)
        
{
            TryRight();
        }


        
void RbacButton_Click(object sender, EventArgs e)
        
{
            TryRight();
        }

        
        .
}
TryRight就是我们用来判断权限的函数了.但这里有一个问题,我们的控件是共同的控件,不可以知道应该如何判断.但是,在共同控件中,我们可以得到Page的实例,这个应该知道如何判断权限了吧.
所以,判断权限代码如下面形式:
        共用部分

解决了上面的问题,稍带也把没有权限的按钮设置成不显示了,有好处吧! 下面就可以看下如何使用了.
    <asp:RbacButton ID="btnSave" 
        RbacResourceAlias
="user.card" 
        RbacOperationAlias
="modify" 
        runat
="server" 
        OnClick
="OnSaveCard" 
        Text
="修改" />
这下简单多了.修改也简单.

posted on 2007-04-06 11:57 阿牛 阅读(2751) 评论(6)  编辑 收藏 所属分类: ASP.netC#

评论

#1楼  2007-04-06 12:15 软件~民工      
我认为把对资源的操作作为权限划分的最小单位,在上面如果按钮功能中要操作很多资源,上面就只能把这些资源全部分配给这个按纽,具体实现时候我觉得使用资源url来标示, url是由页面的地址(可以是路径,也可以是类全路径)和资源操作编码来组成..这里只是我的一个想法,欢迎大家拍砖
  回复  引用  查看    

#2楼  2007-04-06 12:38 众吉网信      
@软件~民工
同意
  回复  引用  查看    

#3楼  2007-04-06 21:05 Clark Zheng      
希望能结合rbac在.NET中的实现写一个更全面的文章,设计和实现一块教给偶,那偶就乐翻天啦!
  回复  引用  查看    

#4楼  2007-04-07 13:24 jiandan      
关注.
最近刚好被客户搞得郁闷死了,他们说我们的权限控制太复杂,又不切合实际的需求.客户说的也有道理,我现在都被系统的权限搞乱了.
  回复  引用  查看    

#5楼  2007-04-07 22:31 lexus      
lz已经将权限细化到函数,实现了功能权限的控制
是否可以再深入下去,实现数据权限的控制
  回复  引用  查看