我有一个表用户
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在会话变量中具有状态,而不是在每个页面上查询数据库。如果我创建另一个状态表,我将需要在每个页面上查询状态表,以查看是否包含该用户的角色。我想以某种方式将这些信息记在内存中,但我不确定如何。
或许还有其他方法?
答案 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 ....