最近在做有关权限设计的模块,打算基于角色的访问控制RBAC (Role-Based Access Control) ,我已经设计好了三张表:人员,角色,权限。人员放到角色里,然后给角色赋权。以上是基本的思路。我想请教一下,当打开一个页面(aspx)时候,比如增加、删除、修改三个按钮,如何根据这三种权限来控制这三个按钮的可见与不可见。因为在程序设计的时候,有很多页面都有这样三个按钮,如果才可以做的比较通用呢?谢谢各位了!

解决方案 »

  1.   

    在用户登录时创建Session对象,用于存储权限信息,然后再页面检查,不过好像不是很通用!
      

  2.   

    写一个CustomeButton类,继承自Button,添加一个属性,即权限标识符属性:然后跟据这个东西 判断是否有权限
    如:
    <uc1:Button id="btnEdit" Active="Edit" runat="server" Text="编辑"/>
      

  3.   

    重写个自己的PAGE类判断记录的ROLE信息
      

  4.   

    可以重写button,加个tag属性。不同的按钮根据不同权限设置tag属性,不如but允许3个权限(1,2,3),设置tag="1|2|3"然后系统所有页面的.cs类继承1个同1个基类PageBase,在PageBase中取当前用户的权限,比如该用户有权限1,然后循环取所有页面中的button,并跟button中的tag属性判断是否有1个的,有的则显示,没有的则隐藏。这个方法通用,只需在PageBase写代码就OK
      

  5.   

    或者给按扭加上CommandName 属性,这个属性的值加上前缀如:<asp:button id="edit" commandname="Role_Edit"...?
    然后在写一个公有的判断方法就OK了,跟据Role_Edit 进行操作如BasePage
      

  6.   

    wuxing2006(金宝) :不是很明白你的意思,可以说的更详细点么?
      

  7.   

    to BearRui: 如果遍历的话,速度会不会比较慢
      

  8.   

    to BearRui: 如果遍历的话,速度会不会比较慢
    ------------------
    不会,以前winform很多控件都是这么做的,你可以自己试试,看看速度会不会慢,我只是提供这个思路,你也可以把当前用户的权限保存到session,然后直接在重写button的类中去判断session中的权限和tag比较,这样就不用遍历控件了,不过需要在你的重写button的类能访问到你当前用户的权限
      

  9.   

    我看还是控制页面比较好
    每个页面定义一个变量,对应你的权限
    如:
    private Enum m_Page_Module_Function = EnumModelFunction.UserInfoSearch;
    对应用户资料查询
    UserInfoSearch 对应模块ID =10,
    然后你就判断就可以了
      

  10.   

    to  BearRui :你的第二种方法我不太理解
      

  11.   

    就是把遍历的方法改一下,不是要重写button,加个tag属性吗,那就在button中这样写private string tag;
    public string Tag
    {
       set
      {
          string str = "1";   // 这里取当前用户的权限,这里假设是1
          tag = value;
          if(tag.IndexOf(str)==-1){
             // 找不到权限1,说明该用户没有执行该button的权限,
             // 隐藏
             this.Visiable = false;
          }
       }
    }
      

  12.   

    BearRui 的想法不错,不过遍历的方法是否在效率上有影响,值得商榷