Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2011-05-24 11:25:00

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 881
Сайт

Аутентификация. OOP way

Публикую простенький "фреймворк", использующий аутентификацию форума fluxbb.

Скачать пример: https://rapidshare.com/files/505321830/fluxbb_auth.zip
Загляните в protected/config/main.php чтобы узнать как настроить на свой форум
Загляните в protected/classes/UserModel.php чтобы понять - я сделал заглушку smile реально надо читать из базы, конечно
Подразумевается, что нужная кука нам доступна, потому что мы читаем её в том же домене.

Сама аутентификация выглядит так:

<?php

class App extends Component
{
    public $cookie;
    public $userModel;
    public $user;
    public $timeout;

    public function __construct(array $args = NULL)
    {
        parent::__construct($args);

        $this->cookie    = new Cookie(Registry::get('cookie_params'));
        $this->userModel = new UserModel(Registry::get('user_params'));

        $this->authenticate();
    }

    public function authenticate()
    {
        $now = time();

        $authCookie = $this->cookie->getAuth();
        if (!empty($authCookie) && preg_match('/^(\d+)\|([\da-fA-F]+)\|(\d+)\|([\da-fA-F]+)$/', $authCookie, $matches)) {
            $userId = intval($matches[1]);
            $hash1  = $matches[2];
            $expire = intval($matches[3]);
            $hash2  = $matches[4];
        }

        if (isset($userId) && $userId > 1 && $expire > $now) {

            if (Security::hmac($userId.'|'.$expire, $this->cookie->seed.'_cookie_hash') != $hash2 ||
                is_null($user = $this->userModel->getById($userId)) ||
                Security::hmac($user['password'], $this->cookie->seed.'_password_hash') !== $hash1) {

                $expire = $now + 31536000; // + 1 year
                $this->cookie->setAuth(1, sha1(rand()), $expire);

            } else {

                $expire = ($expire > $now + $this->timeout) 
                    ? $now + 1209600         // + 2 weeks
                    : $now + $this->timeout; // + 30 minutes (by default)
                $this->cookie->setAuth($user['id'], $user['password'], $expire);
                $this->user = $user;
                return TRUE;

            }
        }

        $this->user = array('id' => 1, 'name' => 'Guest');
        return FALSE;
    }

}

Помоему метод authenticate() выглядит намнооого понятнее, чем оригинальный check_cookie(). Возможно это кому-то поможет в написании своего портала на базе флакс.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#2 2011-05-24 22:47:32

Luca
Участник
Зарегистрирован: 2009-10-08
Сообщений: 164

Re: Аутентификация. OOP way

@artoodetoo, а можешь описать практическое примененение данной возможности?

Offline

#3 2011-05-25 09:27:06

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 881
Сайт

Re: Аутентификация. OOP way

Интеграция с чем угодно. Если тебе надо свести два разных движка на одном сайте, первая проблема - единая авторизации. Потом будут другие проблемы, но это первое.

Для справки:
Самый простой способ использовать авторизацию flux - подключить его include/common.php и потом прочитать $pun_user.
Мне такой способ не нравится, т.к. fluxbb создает переменные в глобальной области видимости и вообще подключится много лишнего, что в "стороннем" движке уже реализовано каким-то образом. Будет как минимум дублирование, а возможно и конфликты.

ПОЭТОМУ, я предлагаю OOP подход с нормальной изоляцией данных.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens