Извлечение прав пользователя из базы данных - проблема концепции - PullRequest
1 голос
/ 25 июля 2011

У меня есть таблица пользователей

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 ]

1 голос
/ 26 июля 2011

решение для хэш-карты, обеспечивающее возможность чтения таблиц БД и кода, может быть:

в 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 .... 
1 голос
/ 26 июля 2011

Вы все еще можете хранить несколько статусов в переменной сеанса, я бы рекомендовал список с разделителями-запятыми:

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
1 голос
/ 25 июля 2011

Используйте хэш-карту различных значений статуса и ИЛИ вашего пользователя с любым разрешением, которое он запрашивает.

0 голосов
/ 26 июля 2011

Я работаю с двумя таблицами:
"пользователи" имеют "профили", ассоциированные и
"профили" имеют "разрешенные действия", ассоциированные
вы можете поддерживать свою " нормальную линейную систему возрастающего статуса" "на основе" статуса ", и вы можете начать переход на эту новую модель. Это упрощенная часть моего login.aps (классическая). Я также поддерживаю" разрешенные действия "в сеансе
, возможно (я не уверен, если это хорошо в качестве долгосрочного решения) вы можете использовать поле «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 .... 
...