TIP: Use Markdown or, <pre> for multi line code blocks / <code> for inline code.
These forums are read-only and for archival purposes only!
Please join our new forums at discourse.kohanaframework.org
Auth и База Данных
  • Привет Всем.

    @version kohana 3.2.2

    Обратил внимание, после авторизации пользователя в сессии создается экземпляр класса Model_User который при перезагрузке / переходе по страницам обращается к БД за пользователем.

    Почему бы в сессии ни хранить данные пользователя. вида stdClass{ 'id'=>1, 'username' =>'John' ... }

    ожидаю критики данного класса

    class User extends Auth{

    public static $instance = NULL;
    public $Auth;        // Auth::instance();
    public $Session;     // Session::instance();
    
    protected $_authSessName = NULL;
    
       /** *****************************
     *  __construct()
     * 
     */
    public function __construct( Session $session )
    {
        // Создал объект Auth
        if( $this->Auth === NULL )
        { 
            $this->Auth = Auth::instance();
        }
    
        $this->Session = $session;
    
    }/** END **/
    
    /** 
     *  factory
     *  @param (object)
     *  @return (object)
     */
    public static function factory( Session $session )
    {
        if ( self::$instance === NULL )
        {
            return new self( $session );
        }
    
        return self::$instance;
    
    }/** END **/
    
    protected function _login($username, $password, $remember){}
    public function password($username){}
    public function check_password($password){}
    
    /**
     *  Данный метод перегружает метод Auth::instance()->get_user( $default = NULL )
     *  тем самым предотвращает постоянное обращение ( при перезагрузке / переходе по страницам )  
     *  к базе данных для получения дангных пользователя
     *  
     *  Перезаписываю сессию не эксемпляр класса Model_User, а данные пользователя как stdClass
     *  id, password, username, email ...
     */
    public function get_user( $default = NULL )
    {
        // Имя сессии
        $sesName = $this->_get_auth_session_name();
    
        $user = $this->Session->get( $sesName );
    
        // Проверяю сущ. класса Model_User в сессии 
        if( is_object($user) AND $user instanceof Model_User )
        {
            // Массив в объект
            $user = self::array_to_object($user->object() );
    
            // Перезапись сессии
            $this->Session->set( $sesName,  $user ) ;
    
            return $user;
        }
    
        // Возвращаю данные пользователя
        if( is_object($user) AND $user instanceof stdClass )
        {
            return $user;
        }
    
        return $default;
    
    }/** END **/
    
    /** 
     *  Перегрузил Auth::instance()->logged_in( $role );
     *  Для проверки данной роли пользователя тянем его из базы
     * 
     *  !!! Читай функцию $this->get_user()
     */
    public function logged_in( $role =  NULL )
    {
        // Получил stdClass
        $user = $this->Session->get( $this->_get_auth_session_name() );
    
        if($user === NULL)
        {
            return NULL;
        }
    
        // Создал модель пользователя, она же получит данные из базы данных
        $model_user = new Model_User( $user->id );
    
    
        $this->Session->set( $this->_get_auth_session_name(), $model_user );
    
        return $this->Auth->logged_in( $role );
    
    }/** END **/
    
    /**
     *  Logout
     */
    public function logout( $destroy = false, $logout_all = false )
    {
        $this->Auth->logout( $destroy, $logout_all );
    
    }/** END **/
    
    /** 
     *  Получаю имя сессии авторизации
     */
    protected function _get_auth_session_name()
    {
        if( $this->_authSessName === NULL)
        {
            return $this->_authSessName = Kohana::$config->load('auth')->session_key ;  
        }
        return $this->_authSessName;
    
    }/** END **/
    
    /**
     * Рекурсивная конвертация массива в stdClass
     * @param (array) массив данных
     */
    public static function array_to_object($array) 
    {
        $obj = new stdClass;
            foreach($array as $k => $v) 
            {
                if(strlen($k)) 
                {
                    if(is_array($v)) 
                    {
                        $obj->{$k} = self::array_to_object($v); //RECURSION
                    }else{
                        $obj->{$k} = $v;
                    }
                }
            }
    
        return $obj;
    }/** END **/ 
    

    }//

  • @hilton413, потому что уязвимо очень. А запрос к БД для получения пользователя не самое критичное место в системе. К тому же, когда код разрастается, то там может формироваться куча связей, а не просто получить ID и логин.

  • Что касается уязвимости... Session::instance()->regenerate(); Который не предусматривает ввода true|false http://fi2.php.net/manual/ru/function.session-regenerate-id.php

    в остальном согласен... спс

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

In this Discussion