我有一个用户表
ID status
1 5
2 50
3 60
4 999
5 5
表中的每个用户都有其状态。状态意味着:
5 = normal user
50 = article writer
60 = blog writer
999 = administrator
在我拥有正常的状态值递增线性系统之前,一切都很好。如果页面仅供管理员访问,我对状态 999 进行 session 检查,如果页面可由最小状态用户访问,我检查状态是否 > 2 等......无需访问数据库即可工作(我在 session 中获取了状态变量,以便仅在 session 超时和首次访问时查询 mysql)。
现在我遇到了文章作者和博客管理员的问题……概念有问题。我只能将 = 或 > 应用于状态,因此只允许一种状态或任何更高的状态。管理员可以看到所有内容,因此它具有最高编号。
现在我希望用户 2 也能成为博客作者,所以实际上有 2 个确切的角色。他需要同时拥有状态 50 和 60。 60 并不高,因为我不希望每个博客作者也能看到文章管理。现在该怎么办?
我当然可以放入状态列 50,60,然后解析出正确的列,但我会松开数字列,我认为将列字段误用于多个值是一种不好的做法。
合乎逻辑的方法是制作一个像这样的状态表
IDuser status
2 50
2 60
3 60
1 5
5 5
4 999
因此,当我在博客页面上时,我可以查询确切的所需状态,并且一个用户可以拥有多个角色...
但是... 正如我所写的,我在使用经典 ASP 的 session 变量中有状态,而不是在每个页面上查询数据库。如果我制作另一个状态表,我将需要在每个页面上查询状态表以查看是否包含该用户的角色。我想以某种方式将此信息保存在内存中,但我不确定如何。
或者还有别的办法?
最佳答案
保持数据库表和代码可读的 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 或 session 重新启动时
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 ....
关于mysql - 从数据库中获取用户权限 - 概念问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6821490/