Права доступа / Авторизация - какие есть паттерны?

Статус
В этой теме нельзя размещать новые ответы.

newbigmir

Знаток
Регистрация
31 Июл 2007
Сообщения
284
Реакции
26
Права доступа / Авторизация - какие есть паттерны?

варианты:
1. хранить права доступа в mysql и каждый раз делать запрос в бд на то имеет ли эта группа пользователей права на просмотр страницы или нет.

2. Хранить права в куках/сессии

3. ...

Какие есть паттерны и их преймущества/недостатки?
 
???

меня тоже интересует эта тема, еще надо чтобы был скрытый текст только для определенных пользователей или групп
 
Если пользователь должен оставаться залогиненым дольше чем продолжается сессия (т.е. и спустя несколько дней после захода, например), то по-любому придется использовать BD. А после проверки по базе, можно ставить сессию, чтобы каждый раз не обращаться к базе.
 
Я по максимуму стараюсь хранить все в куке, чтоб не дергать базу. А чтоб куку не могли подделать или увести, ее надо подписывать и ограничивать по времени.

Итого к полезной инфе (допустим, id юзера и битмаска прав) добавляется еще timestamp окончания срока действия, и md5.
PHP:
function sign($str) {
  $validate = $_SERVER['HTTP_USER_AGENT'].$_SERVER['REMOTE_ADDR'];
  $secret = 's@m< ! абяЯКА ї'.chr(254);
  return md5($str.$secret.$validate);
}

function setcook() {  
  $time = time() + 15*60;	// время на 15 минут
  $cookie = $time. '-' .$this->id. '-';
  $cookie .= $this->sign($cookie);
  setcookie('user', $cookie, 0, '/');   // lifetime=0
  $_COOKIE[user] = $cookie;

}

function checkcook() {
  $arr = array();
  if (isset($_COOKIE[user]) && preg_match("/^(\d+)-(\d+)-(\d+)-([0-9a-f]{32})$/",$_COOKIE[user],$arr) ) {
    $str = $arr[1] . '-' . $arr[2] . '-' . $arr[3] . '-';
    $id = (int) $arr[3];
    $time = (int) $arr[2];

    if ($time > time() && $arr[4] == $this->sign($str)) {
	// юзер залогинен
	        ......
        // пролонгируем куку, если осталось меньше 10 минут
	if ($time - time() < 60*10) $this->setcook();	
	}
     }	
}

Итоговая кука имеет вид time()-$id-md5(). Обращаться к базе, чтобы определить подлинность - не надо, работает супербыстро, даже несмотря на тормознутую md5 (которую можно заменить на еще более тормознутую sha1, которая к тому же более секурная, хотя в данном случае это и не играет роли).

Из минусов данного метода - нельзя сделать кнопочку "logout from all other computers".
 
Курить в сторону ACL. Если писать обламывает - можно выдернуть пакет из ZendFramework (зовется ZendACL)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху