用户权限从数据库中获取 - 概念问题

时间:2011-07-25 19:48:58

标签: mysql database-design asp-classic roles

我有一个表用户

ID    status
1     5
2     50
3     60
4     999
5     5

表格中的每个用户都有自己的状态。状态意味着:

5 = normal user
50 = article writer
60 = blog writer
999 = administrator

直到我有正常线性系统的升序状态值,一切都很好。如果页面仅供管理员访问,我会对状态999进行会话检查,如果页面可由最小状态用户访问,则检查状态是否为> 2等...它可以在不访问数据库的情况下工作(我在会话变量中获取了状态,因此只有在会话超时和首次访问时才会查询mysql。)

现在我对文章作者和博客管理员有问题......存在一个概念问题。我只能申请=或>为状态,因此只允许其中一个状态或更高的状态。管理员可以看到所有内容,因此它的编号最高。

现在我希望用户2也可以成为博客作者,所以实际上要有2个确切的角色。他需要同时拥有50和60的状态。 60并不是因为我不希望每个博客作者也能看到文章管理。现在该怎么办?

我当然可以输入状态列50,60,然后解析出正确的列,但是我会松开数字列,我认为将列字段误用于多个值是不好的做法。

逻辑方式是制作类似

的状态表
IDuser     status
2          50
2          60
3          60
1          5
5          5
4          999

因此,当我在博客页面上时,我可以查询确切需要的状态,并且一个用户可以拥有多个角色......

但是......正如我写的那样,我使用经典ASP在会话变量中具有状态,而不是在每个页面上查询数据库。如果我创建另一个状态表,我将需要在每个页面上查询状态表,以查看是否包含该用户的角色。我想以某种方式将这些信息记在内存中,但我不确定如何。

或许还有其他方法?

4 个答案:

答案 0 :(得分:1)

使用各种“状态”值的哈希映射,并使用他们要求的任何权限对您的用户进行操作。

答案 1 :(得分:1)

你仍然可以在会话变量中存储多个状态,我建议使用逗号分隔列表:

Session.Contents("Status") = "50,60"

然后,您可以将列表作为数组获取,即

Dim Status
'Check if there is a comma in the list
If (InStr(Session.Contents("Status"), ",")) Then
   Status = Split(Session.Contents("Status"), ",")
Else
   Status Array(Session.Contents("Status"))
End If

'Use a for loop to check if the user has access
i = 0
For i = LBound(Status) To UBound(Status)
   'Do your check here
Next

答案 2 :(得分:1)

保持db表和代码可读的hashmap解决方案可以是:

在header.inc

'add new tasks  here  (and in perfiles table) '
mask_order = "write_article,read_article,write_blog,read_blog"

' this function can be coded 2 ways: checking bad parameters or   '
' not checking bad parameters (best perfomance, but unpredictible problems on wrong calls), i coded this way here '
function can_user(what)
    x = split(" " & mask_order, what)    ' the extra space is needed here '
    x = ubound(split(x(0), ","))+1
    can_user = (session("mask") and 2^x)<>0
end function

登录login.asp或会话重启

sql="select users.usuario, perfiles.* from users inner join perfiles on users.perfil=perfiles.perfil" _
 & " where usuario = '" & limpia(quien) & "' and pass ' = '" & limpia(password) & "';"
r.open sql, c
ok = not r.eof
if ok then 
    mask = 0: i = 0
    for each campo in split(mask_order, ",")
      i = i +1
      if r(campo) then mask = mask or 2^i
    next
    session("mask") = mask

所需的每个文件

if can_user("read_article") then .... 

答案 3 :(得分:0)

我做两张桌子:
“用户”有“配置文件”联系和 “个人资料”已经“行动”了 你可以根据“状态”保留你的“正常升序状态线性系统”,你可以开始迁移到这个新模型 这是我login.aps(clasic)的一个简单的部分我也在会话上保持“alowed actions” 也许(我不是很好,如果它作为长期解决方案很好)你可以使用“status”字段作为连接betwin用户和alowed_actions_by_profile表

sql="select users.usuario, perfiles.* from users inner join perfiles on users.perfil=perfiles.perfil" _
 & " where usuario = '" & limpia(quien) & "' and pass ' = '" & limpia(password) & "';"
r.open sql, c
ok = not r.eof
if ok then 
    for each campo in r.fields
      if campo.name<>"usuario" then session("can_" & campo.name) = r(campo.name)
    next
    session("user") = r("usuario")

这里的个人资料表就像

perfil         varchar(20) not null,   
write_article  bolean null,   
read_article   bolean not null,
write_blog     bolean null,   
read_blog      bolean not null,
and so on 

并将代码检入

if session("can_write_blog") then ....