/************  权限管理数据库设计**********************
http://expert.csdn.net/Expert/topic/2180/2180181.xml?temp=.5715753
关于权限包容关系通过角色和权限掩码来实现。

解决方案 »

  1.   

    关于权限设计的探讨    csdntoll(转贴) 
    原文:http://expert.csdn.net/Expert/topic/1653/1653829.xml?temp=.2015345
    作者:  zealberg (冰山)
      

  2.   

    基于用户、角色、权限的概念可以彻底解决以上问题.权限:用户对一个功能点能做的操作,包括对一个页面的打开,对一个业务逻辑的调用;用户:用户名/口令字构成的一对;角色:权限的集合。相互之间的对应关系:用户和权限之间没有直接对应关系;一个用户可以扮演多个角色,多个用户可以扮演相同的角色;一个角色对应了由若干个权限组成的集合,某个权限可以分属多个不同的角色。
    把以上三个概念实现在你的数据库中作为应用的基础。在使用的时候,应该让所有的用户通过同一个登录页面登录;
    登录页面对用户的口令字/用户名进行验证,如果合法的话在Session对象的集合里面写上他(她)的角色;
    在使用任何一个功能点之前验证用户的权限是否足够,从Session对象里面获取他(她)的角色,从数据库里面查看他(她)是否有足够的权限。以上就是解决类似问题的通用解决办法。
    如果你的用户使用USB Encripted Token之类的加密工具,他(她)的角色就可以写在他的USB Token里面,那样子的话就更安全。
    -----------------
    前提:
    1、登录者是已经注册的用户
    2、有设置权限范围(即是将被管理的对象)   
          如: 公司的每个部门,系统的每个模块,每级栏目等。设置:
    1、被管理对象,
             按类设置被管理对象的值(唯一性),类别中再设小类。
            如,集团为1,集团下公司为01,集团下工厂为02
                公司财务部相对应的唯一值为: 01001;公司技术部的值为:01002
                工厂财务部相对应的唯一值为: 02001;工厂营销部的值为:020022、管理者
             给管理者赋权限:想给他管理公司财务部,在该用户的相关字段Rank(假设)写入01001;如果同时管理公司财务部和公司技术部那么Rank为01001,01002(多选);多个权限类推。 如果管理整个公司则Rank为013、判别权限时,用户Rank字段与被管理对象的相对应的字段进行比较。。----------------
    基于用户、角色、权限的概念可以彻底解决以上问题.
    这个太对了!
    权限:用户对一个功能点能做的操作,包括对一个页面的打开,对一个业务逻辑的调用;一般分为这么几种 浏览 查询(对select的划分) 增加  修改(这个包括审定)删除  还有一个级别。用户:用户名/口令字构成的一对;
    通常情况下要做到这么复杂的系统口令和用户名最好都加密 :) 
    口令最好是 不可逆加密 用户就不能:)
    角色:权限的集合。
    这里假定有级别 (可以为一数组) 和其它的权限 浏览查询另外业务跟角色的关系有两种写法  1、由业务上定义某个角色
                                  2、角色对某个业务的处理
    上面两个方法大致一样,但是我认为采用1、更好。因为以后业务的变化是经常的。
      

  3.   

    转载:在使用的时候,应该让所有的用户通过同一个登录页面登录;
    登录页面对用户的口令字/用户名进行验证,如果合法的话在Session对象的集合里面写上他(她)的角色;
    在使用任何一个功能点之前验证用户的权限是否足够,从Session对象里面获取他(她)的角色,从数据库里面查看他(她)是否有足够的权限。-------------------------
    用户/权限系统:
    几个基本概念:
    1.元权限:最基本的权限元素。如添加、修改、删除、审核等都属于一个元权限。
    2.权限范围:一个行使权限的空间范围和时间范围。比如只在asp论坛内有修改权限,在delphi论坛却没有,同时必须指定在asp论坛内行使权力的时限。
    3.角色:角色= 一组元权限 + 权限范围
    4.用户:用户名/口令字构成对。
    5.用户组:具有相同权限的用户可以划为一个组。
    6.授权:对某个用户/用户组赋某个角色。
    7.用户转组:将用户转到其他用户组中。了解了这些,数据库设计不难了吧。该系统可以应付各种情况,可以说是一个通用系统。
    -----------------
    如果有多种权限,我最常的方法是在用户表中加一个字段,这个字段保存权限, 字段的每一个位代表一种权限,如 1 代表销售权限,那么你的用户记录里的权限字段中就有 1 ,依此类推,如果你有几个权限就有几位。
    在判断的时候,先指定哪些页面属于哪些权限并代表哪个字母(例如销售代表1),如果你进入销售页面时,你的数据库权限字段没有1这个字符,那么就进入失败。
    -------------------------
    有关用户权限的七个表(初次设计这么复杂的用户权限,正在写程序,请高手指点)
    ----------------------------------------------------------------
    对某个对象加入对象表,及对象粒度表中,得到ItemID
    如新闻的浏览页面是NewsView.asp,在对象表中加入"新闻",在对象明细表中加入"新闻_浏览"
    得到的ItemID是1
    在NewsView.asp这个文件中预先写入
    Dim ItemID
    ItemID=1
    UserID=Session("UserID")
    '根据这二个参数ItemID,UserID到角色表权限中查是否有值,到用户权限表中查是否有记录
    -----------------------------------------------------------
    查角色权限表(用户可以属于多个角色,查这个用户所属的多个角色中哪些角色有权限)
    if exists( SELECT P_Role_Permission.ItemID
    FROM P_Role_Permission INNER JOIN
          P_Role ON P_Role_Permission.RoleID = P_Role.RoleID INNER JOIN
          P_User_Role ON P_Role.RoleID = P_User_Role.RoleID INNER JOIN
          P_User ON P_User_Role.UserID = P_User.UserID
    WHERE (P_User.UserID = @a_intManage_UserID) AND (P_Role_Permission.ItemID = @a_intObject_small_ItemID))
    return(-3)
    -------------------------------------------------------------------------
    查用户权限表(用户可以单独增加某个权限,尽量将权限分配到角色中,将用户分配到角色中)
    if exists(SELECT P_User_Permission.ItemID
    FROM P_User_Permission INNER JOIN
          P_User ON P_User_Permission.UserID = P_User.UserID
    WHERE (P_User_Permission.ItemID = @a_intObject_small_ItemID) AND (P_User.UserID = @a_intManage_UserID))
    return(-3)
    没有记录就是没有进入这个页面的权限.
    -------------------------------------------------------------
    角色表P_Role    [RoleID] [int] IDENTITY (1, 1) NOT NULL                     角色编号,
    [RoleName] [varchar] (200)  NOT NULL                        角色说明
    -----------------------------------------------------------------
    用户表
    P_User    [UserID] [int] IDENTITY (1, 1) NOT NULL                    用户编号,
    [UserName] [varchar] (50)  NOT NULL                        用户名,
    [PassWord] [varchar] (50)  NOT NULL                        密码,
    [Question] [varchar] (50)  NOT NULL                        密码提示问题,
    [Answer] [varchar] (50)  NOT NULL                          密码提示问题答案,
    [Nickname] [varchar] (50)  NOT NULL                        昵称,
    [TrueName] [varchar] (50)  NOT NULL                        真名,
    .........................
    ----------------------------------------------------------------------
    用户角色表P_User_Role   (外键 关联表 P_User,P_Role) [URID] [int] IDENTITY (1, 1) NOT NULL                      用户角色编号,
    [UserID] [int] NULL                                        用户编号,
    [RoleID] [int] NULL                                        角色编号 
    ---------------------------------------------------------------------
    对象表P_Object [ObjID] [int] IDENTITY (1, 1) NOT NULL                      对象编号,
    [ObjName] [varchar] (50)  NULL                              对象名 
    -----------------------------------------------------------------------------
    对象粒度表P_Object_small  (外键 关联表 P_Object) [ItemID] [int] IDENTITY (1, 1) NOT NULL                       对象粒度编号,
    [ObjID] [int] NULL                                            对象编号,
    [ItemType] [varchar] (50)  NULL                               对象粒度类别,
    [DataString] [varchar] (200)  NULL                            操作的SQL语句,
    [DataSource] [varchar] (200)  NULL                            采用的数据库用户权限 
    ----------------------------------------------------------------------
    用户权限表
    P_User_Permission  (外键 关联表 P_User,P_Object_small) [UIID] [int] IDENTITY (1, 1) NOT NULL                          用户权限编号,
    [UserID] [int] NULL                                            用户编号,
    [ItemID] [int] NULL                                            对象粒度编号,
    [Value] [varchar] (50) NULL                                    用户对某对象粒度的权限值 
    ---------------------------------------------------------------------
    角色权限表P_Role_Permission   (外键 关联表P_Role,P_Object_small) [RIID] [int] IDENTITY (1, 1) NOT NULL                           角色权限编号,
    [RoleID] [int] NULL                                             角色编号,
    [ItemID] [int] NULL                                             对象粒度编号,
    [Value] [varchar] (50) NULL                                     角色对某对象粒度的权限值
    -------------------------------------------------------------------------
    我以前的做法是:
    对权限进行分级如超级管理员1,公司管理员2,操作用户3,客户4,普通用户5然后再建立一张表,将某个级别的用户再细分(由于操作用户3有不同的权限组合)用的时候先进行大的权限检查,如有必要再进行细分的权限检查。