主题:  数据库设计中,如何设计权限问题

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#12004/10/19 22:17:40
现在一些软件中,很多涉及到权限问题,而且权限的分类很细,很多。
我想把这问题带到这儿来讨论。

现在一些设计中,每个权限用一个字段BOOLEAN或BYTE值来表示,这样如果有几十个权限,那么就有几十个字段。而且有个用户需要变化用户权限,加上、变更或删除该权限设置。

如果用程序来判断的话,如用ASP
If RS("purview1" Then ......
假定,如果这个权限在很多处都要用,但如果该用户某日想取消这个purview1的权限,那么可想,在很多处都要修改程序。

另外,如果想增加几种权限,就得在数据库上增加字段,这样对维护不是很方便。

各位在设计权限时不知是怎么做的,很想讨论一下。


非常大鱼

沉默是金

职务:普通成员
等级:6
金币:11.2
发贴:4357
#22004/10/20 9:10:57
把所有的权限写在一个字段里面,按二进制的形式把种权限写入,有该权限的就是:1,没有权限的就是:0,例如:011010011101010101010101

在验证该用户是否有此项权限时,写一个function或sub,带参数进去用mid的方法判断该权限所映射的是0或是1。

个人意见,仅供参考。


难人一个……

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#32004/10/20 10:13:53
arhui在上个帖子中说
引用:
把所有的权限写在一个字段里面,按二进制的形式把种权限写入,有该权限的就是:1,没有权限的就是:0,例如:011010011101010101010101

在验证该用户是否有此项权限时,写一个function或sub,带参数进去用mid的方法判断该权限所映射的是0或是1。

个人意见,仅供参考。


我比较顷向这种设计,比如一个单位软件可能需要40种权限,就给预留100位,并把权限按多少分区域,如管理功能预留10位,文章发表10位,工作权限30位......,总之预留位尽量多些,以便扩充。

另外,我想程序设计中对权限管理也很重要,应该用一个文件或函数来管理。
现在用.NET来开发就比较方便了。

.NET可能用类来管理权限。权限中的101111000象密码难以看懂,对程序维护不是很容易,所以用枚举的方式,把位数转化为可读懂的意义:

enum Purview {IsAdmin, ManageMember, ManageArticle, ......,
    ManagePreSet1, ManagePreSet2, ......,
    ArticleSend, ArticleView, .....,
    ArticlePreSet1, ArticlePreSet2, ......};

或用结构定义权限
struct PersonPurview
{
    public bool IsAdim;
    public bool ManageMember;
    ......
}

用enum方式很方便,权限码strPurview
用函数,判断是否有该权限
public bool HasPurview(Purview, purview)
{
    if ( srtPurview.SubString(Covert.ToInt32(purview) - 1, 1) = "1" )
    {
        return true;    
    }
    else
    {
        return false;
    }
}

用法:

if ( HasPurview(Purview.ArticleSend) )
{
    ......;
}

用结构,可能预读取用户信息后,把用户所有权限都设置在结构中

PersonPurview myPurview = new PersonPurview
..... // 预设置
if ( myPurview.IsAdmin )
{
    ......;
}

以上两种方法各有长处,也可以在一处程序中同时使用两种方法。
这是本人一些设想,很想能抛砖引玉。

编辑历史:[此帖最近一次被 蓝鲸 编辑过(编辑时间:2004-10-20 10:19:58)]

非常大鱼

dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
#42004/10/20 10:50:10
楼上两位均是高人,多谢指点~