判断用户权限时,将“权限编码”直接写到程序中,是规范的设计吗?
-------------------------
要进行用户权限的管理,必定要有一个权限表,一个用户对应相应的一组权限,用户对数据表进行添加删除修改时,要进行权限验证时,直接将权限编码写入到程序代码中,是规范的设计吗?
比如用户名与对应权限的编码表如下:
用户名,权限,权限名称
001,aaa,入库查询
001,bbb,出库查询
001,ccc,统计汇总
002,aaa,入库查询
003,bbb,出库查询
那么判断用户001是否有出库查询时,用户名是存在一个变量中的,比如登录时,将用户名存在变量user中,
即   user="001",
我就要判断001用户是不是具有bbb权限,这样可以吗?关键是"bbb",是否可以直接写入到代码中,
我认为这不太合理,因为这样就将数据库中的权限表定死了,权限表一改,程序就不适用了。但是,如果不将权限码写到程序中,我也找不到判断的办法呀?

解决方案 »

  1.   

    当然要查询数据库中的表了,比如数据库中,用户001有aaa的权限,我在程序中调用sql查询
    比如用户名存在变量 struser中了,即 struser="001"
    "select *
    from 权限表
    where 用户名= '" & struser & "' and 权限码='aaa'"这样返回一个记录集,如果记录集没有记录,则说明用户没有这个权限,如果有记录,说明用户有些权限。这样可以实现需求,但是,权限码aaa写死了,所以我问问这样设计是否合规范。
      

  2.   

    在存贮过程中,也是将权限码写死了呀。比如用户名为 @struser,权限码为'aaa'
    则:if exists(select 1 from 权限表 where 用户名=@struser and 权限码='aaa')
    begin
       --adsfasdf.........
    end
      

  3.   

    是定死了,权限可以增加,可以改名(弄个ID),不可删除  我以前就是写在程序里,不过你可以改进下,用权限的id关联,名称用来显示 
      

  4.   

    REATE PROCEDURE Userright --如果有权限,返回0
    @userid int,
    @progid nvarchar(30)
    AS
    DECLARE @RET INTEGER
    DECLARE @USERNAME NVARCHAR(20)SELECT @USERNAME=F姓名 FROM T操作员  WHERE FID=@USERIDIF @USERNAME='维护员'
    select @ret = 0 
    else
    BEGIN
    if exists(
    select dbo.T操作员权限.操作员ID
    FROM dbo.T操作员权限 INNER JOIN
          dbo.T操作员 ON dbo.T操作员权限.操作员id = dbo.T操作员.fid INNER JOIN
          dbo.T权限分配 ON dbo.T操作员权限.权限组id = dbo.T权限分配.权限组id INNER JOIN
          dbo.T权限 ON dbo.T权限分配.权限id = dbo.T权限.fid
    WHERE DBO.T操作员权限.操作员ID=@USERID AND RTRIM(DBO.T权限.f权限名称)=RTRIM(@PROGID)  and f状态 = 1)
    select @ret=0
    else
    select @RET=1
    END
    return @RET
    GO