用户操作
[即时聊天] [发私信] [加为好友]
方清ID:fangq
34200次访问,排名3558,好友0人,关注者50人。
青春映像,风舞枫扬
fangq的文章
原创 40 篇
翻译 0 篇
转载 4 篇
评论 89 篇
最近评论
elifefly:不错。蛮有用的。和myeclipse的模板效果差不多。
yuboswing:写的太好了!
yuboswing:新手上路,偶遇大师文章。钦佩之至!
rain705:很喜欢你的文章
iq263me:程序员后花园,累了来看看 bbs.iq263.cn
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 权限系统设计 收藏

    新一篇: 用C#创建Windows服务(Windows Services) | 旧一篇: JavaScript使用技巧精萃

     

    1 需求

    目前我做的这个项目的权限的要求可以归结为以下几点:

    1. 用户是基于角色的。每个用户属于,且仅属于一个角色。
    2. 系统中存在至少一个超级用户,且该用户具有所有权限。只有超级用户具有用户管理权限。
    3. 超级用户可以仅仅针对某一个人定义权限。
    4. 对于权限的判断,有以下两种基本形式,其它形式是这两种形式的演化:
      1. 不含参权限。例如用户是否具有添加用户、管理文章分类的权限等。
      2. 含参权限。例如用户是否具有某一个类别的文章的管理权限,这里某一个类别即为参数。

    2 类

    ClassDiagram

    其中:

    1. UserRole表示用户角色、User表示用户。
    2. User含有对UserRole的引用,表示用户属于哪个角色。
    3. UserRole和User都拥有一个权限Power,即拥有一个Power的引用。
    4. Power真正处理权限的判断,UserRole和User的HasPower方法最终委托给Power的HasPower方法。
    5. PowerItem描述的是系统中的权限项目。

    3 调用

    不含参权限判断为:

    User user = getUser();
    bool isUserHasArticleClassManagePower = user.HasPower(PowerItem.ArticleClassManage);
    

    含参权限判断为

    User user = getUser();
    bool isUserHasArticlePower = user.HasPower(PowerItem.ArticleManage, someArticleClassID);
    

    设置用户和用户组具有某一个权限为:

    User user = getUser();
    UserRole userRole = getUserRole();
    Power power = user.Power;  //Or power = userRole.Power;
    power.SetPower(PowerItem.ArticleClassManage);
    power.SetPower(PowerItem.ArticleManage, someAricleClassID);

    清除用户或用户组的某一个权限为:

    User user = getUser();
    UserRole userRole = getUserRole();
    Power power = user.Power;  //Or power = userRole.Power;
    power.ClearPower(PowerItem.ArticleClassManage);
    power.ClearPower(PowerItem.ArticleManage, someAricleClassID);

    4 实现

    User的HasPower方法最终的实现如下:

       1:  /// <summary>
       2:  /// 判断是否具有某一项权限
       3:  /// </summary>
       4:  /// <param name="powerType">权限类别</param>
       5:  /// <param name="param">判断所需要的参数</param>
       6:  /// <returns>是否具有该权限</returns>
       7:  public bool HasPower(PowerItem powerType, object param)
       8:  {
       9:      //超级用户拥有所有权限
      10:      if (_IsSuper) return true;    
      11:   
      12:      //如果该用户是自定义权限,则使用自身的权限进行判断,
      13:      //否则,使用对应角色的权限进行判断
      14:      if (_IsCustomPower)
      15:          return Power.HasPower(powerType, param);
      16:      else
      17:          return _UserRole.Entity.HasPower(powerType, param);
      18:  }

    UserRole的HasPower方法比较简单,仅仅是委托给其Power成员的HasPower方法:

    public bool HasPower(PowerItem powerType, object param)
    {
        return this.Power.HasPower(powerType, param);
    }

    Power类是判断权限的核心。

    其成员Powers以"0,1,1,1"的方式保存了所有的权限。权限在该序列中的位置对应其权限项目的枚举值。例如PowerItem.ArticleClassManage的值是1,则序列"0,1,1,1"的第二个数(下标从零开始),表示是否具有ArticleClassManage权限。

    对于含参的权限。例如PowerItem.ArticleManage,有一个成员AritcleClasses保存了所有判定为真的参数。如果该成员的值为“1,2,5”,则说明该用户或该角色具有ID为1,2,5的这三个文章分类的管理权限。

    其HasPower方法为:

       1:  public bool HasPower(PowerItem powerType, object param)
       2:  {
       3:      if (!hasPower(powerType)) return false;
       4:   
       5:      //根据参数进行判断
       6:      switch (powerType)
       7:      {
       8:          case PowerItem.ArticleManage:
       9:              return hasPower(_AritcleClass, param);
      10:          default:
      11:              return true;
      12:      }
      13:  }

    至于其中私有方法的细节,可以参考代码。

    5 数据库

    数据库

    6 示例代码

    点击下载

    发表于 @ 2008年08月27日 17:42:00|评论(loading...)|编辑|收藏

    新一篇: 用C#创建Windows服务(Windows Services) | 旧一篇: JavaScript使用技巧精萃

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © fangq