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

Тема в разделе "PHP", создана пользователем newbigmir, 5 июл 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. newbigmir

    newbigmir

    Регистр.:
    31 июл 2007
    Сообщения:
    283
    Симпатии:
    23
    Права доступа / Авторизация - какие есть паттерны?

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

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

    3. ...

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

    milionner Писатель

    Регистр.:
    9 май 2008
    Сообщения:
    8
    Симпатии:
    0
    ???

    меня тоже интересует эта тема, еще надо чтобы был скрытый текст только для определенных пользователей или групп
     
  3. hipachka

    hipachka

    Регистр.:
    16 мар 2009
    Сообщения:
    391
    Симпатии:
    78
  4. SolarWind

    SolarWind Создатель

    Регистр.:
    18 авг 2008
    Сообщения:
    42
    Симпатии:
    11
    Если пользователь должен оставаться залогиненым дольше чем продолжается сессия (т.е. и спустя несколько дней после захода, например), то по-любому придется использовать BD. А после проверки по базе, можно ставить сессию, чтобы каждый раз не обращаться к базе.
     
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Я по максимуму стараюсь хранить все в куке, чтоб не дергать базу. А чтоб куку не могли подделать или увести, ее надо подписывать и ограничивать по времени.

    Итого к полезной инфе (допустим, 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'$cookie0'/');   // 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".
     
  6. D@nil

    D@nil

    Регистр.:
    1 окт 2006
    Сообщения:
    338
    Симпатии:
    122
  7. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    Курить в сторону ACL. Если писать обламывает - можно выдернуть пакет из ZendFramework (зовется ZendACL)
     
Статус темы:
Закрыта.