Код CakePHP 2.8 содержит дополнительные данные в $ this-> Auth-> user.Как? - PullRequest
0 голосов
/ 17 ноября 2018

Я работаю с кодом CakePHP 2.8 и не имею доступа ни к одному из предыдущих кодеров, в противном случае, я бы спросил их об этом.Я создаю точку входа в систему для другого приложения, которое обходит стандартную форму входа в систему и просто заходит за кулисы.Когда я захожу на сайт, используя стандартную форму входа, $ this-> Auth-> user заполняется дополнительными данными, как показано здесь:

array(
    'id' => '368',
    'email' => 'jay@somewhere.com',
    'first_name' => 'Jay',
    'last_name' => 'Washere',
    'role_id' => '4',
    'disabled' => false,
    'account_id' => '149',
    'Role' => array(
        'id' => '4',
        'name' => 'Super'
    ),
    'Account' => array(
        'id' => '149',
        'business_name' => 'Jay's Sun Spot',
        <...snip...>
        'setup_needed' => false
    ),
    'UserAvailability' => array(
        'id' => '1151',
        'user_id' => '368',
        'sun_start' => '08:00:00',
        <...snip...>
        'fri_end' => '22:00:00',
        'sat_end' => '22:00:00'
    ),
    'UserConfig' => array(
        'id' => '38',
        'user_id' => '368',
        'calendar_view' => '3',
        'default_scheduler' => '0'
    )
)

Однако, когда я захожу с моего нового контроллера, используяследующий код:

$user = $this->User->findById($userId);
$this->Auth->login($user['User']);

имя входа работает, но $ this-> Auth-> user содержит только:

array(
    'id' => '368',
    'email' => 'jay@somewhere.com',
    'first_name' => 'Jay',
    'last_name' => 'Washere',
    'role_id' => '4',
    'disabled' => false,
    'account_id' => '149'
)

Модель пользователя (без проверки) указана ниже для запроса saveario,Я удалил проверку и некоторые из ассоциаций моделей, которые не включают рассматриваемые поля.

<?php
App::uses('AppModel', 'Model');
App::uses('BlowfishPasswordHasher', 'Controller/Component/Auth');

class User extends AppModel {

    public $virtualFields = array('full_name' => 'CONCAT(User.first_name, " ", User.last_name)');
    public $displayField = 'full_name';
    public $order = 'full_name';

    public function beforeSave($options = array()) {
        if (isset($this->data[$this->alias]['password'])) {
            $passwordHasher = new BlowfishPasswordHasher();
            $this->data[$this->alias]['password'] = $passwordHasher->hash(
                $this->data[$this->alias]['password']
            );
        }
        return true;
    }

    // Validation snipped

    public function validate_passwords() {
        return $this->data[$this->alias]['password'] === $this->data[$this->alias]['confirm_password'];
    }

    public $belongsTo = array(
        'Role' => array(
            'className' => 'Role',
            'foreignKey' => 'role_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Account' => array(
            'className' => 'Account',
            'foreignKey' => 'account_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )

    );

    // hasMany associations snipped, there are 16

     public $hasOne = array(
        'UserAvailability' => array(
            'className' => 'UserAvailability',
        ),
        'UserConfig' => array(
            'className' => 'UserConfig',
        ),
        'CalendarColor' => array(
            'className' => 'CalendarColor',
        )
    );

    // hasAndBelongsToMany snipped, there are 6

    protected function setFlashMessage($success, $type = 'sav') {

        //if user is a duplicate return custom flash message
        if ($success === 'duplicate') {
            $this->_flashMessage = 'A user with this email address is already registered to this account.'.
                'Please check that you are not creating a duplicate user.';
            $this->_flashClass = 'danger';
            return $this->_flashMessage;
        } else {
            return parent::setFlashMessage($success, $type);
        }
    }

    protected function add($save_array) {
        //check if new users email already exists in the account
        if (!$this->isUniqueInAccount($this->_user['account_id'], $save_array['User']['email'], 'email')) {
            $this->setFlashMessage('duplicate');
            return false;
        }

        //set account id and franchise id based on creating user
        $save_array['User']['account_id'] = $this->_user['account_id'];

        //empty any existing information
        $this->create();

        //attempt to save user and position data
        $result = $this->saveAll($save_array);
        if ($result) {

            //load Position class and find entry for current position
            $Position = ClassRegistry::init('Position');
            $position = $Position->find('first', array(
                'conditions' => array(
                    'Position.id' => $save_array['Position']['Position']
                )
            ))['Position'];

            //get class type based on position
            if($position['group_id'] == 2 || $position['group_id'] == 5){
                $workerType = 'Scheduler';
            } else if($position['group_id'] == 1){
                $workerType = 'Closer';
            } else if($position['group_id'] == 3){
                $workerType = 'ProposalWriter';
            }

            //array of data for saving workers and manager as applicable
            if(isset($workerType)){
                $workerArray = array(
                    'user_id' => $this->id,
                    'name' => $save_array['User']['first_name'] . ' ' . $save_array['User']['last_name'],
                    'account_id' => $this->_user['account_id']
                );

                //load worker class and save new data
                $workerClass = ClassRegistry::init($workerType);
                $workerClass->modify('add', null, $this->_user, array(
                    $workerType => $workerArray
                ));

                //set group and manager based on position
                $data['Manager']['group_id'] = $position['group_id'];
                $data['Manager']['manager'] = $position['manager'];

                //load Manager class and save new data
                $Manager = ClassRegistry::init('Manager');
                $Manager->modify('add', null, $this->_user, array(
                    'Manager' => $workerArray
                ));
            }

            //get account info for start and end times
            $account = $this->_getAccountInfo();

            //set start/end time based on configs or default
            $startTime = $account['Config']['business_start_time']
                ? date('H:i:s', strtotime($account['Config']['business_start_time']))
                : '8:00:00';
            $endTime = $account['Config']['business_end_time']
                ? date('H:i:s', strtotime($account['Config']['business_end_time']))
                : '22:00:00';

            //loop through all days and set start/end time
            $days = array('sun', 'mon', 'tue','wed','thu','fri','sat');
            foreach ($days as $day) {
                $data[$day.'_start'] = $startTime;
                $data[$day.'_end'] = $endTime;
            }
            $data['user_id'] = $this->id;

            //load UserAvailability class and save new data
            $UserAvailability = ClassRegistry::init('UserAvailability');
            $UserAvailability->modify('add', null, $this->_user, array(
                'UserAvailability' => $data
            ));
        }

        $accountModel = ClassRegistry::init('Account');
        $account = $accountModel->find('first', array('conditions' => array('Account.id' => $this->_user['account_id'])));
        $key = 'images/' . str_replace('s3-', '', $account['Account']['business_logo_name']);
        $image = 'https://s3-us-west-2.amazonaws.com/sst-account-logos/'.$key;
        $accountData['account'] = $account['Account'];

        $siteConfigModel = ClassRegistry::init('SiteConfig');
        $siteConfigs = $siteConfigModel->find('first', array('conditions' => array('SiteConfig.id' => 1)));

        //set flash and redirect array based on save
        $this->setResponseVariables($result, 'add');
        return $result;
    }
}

Я искал и / app, и / lib, используя "UserAccount", "user_accounts" и аналогичные вариантыдругие дополнительные наборы данных и не нашли ничего, что объясняет, как эти дополнительные данные добавляются в $ this-> Auth-> user.

Итак, у меня есть два вопроса: 1) Как стандартная форма входа в систему включает в себя дополнительныеdata, и 2) Почему вход в систему с данными $ user не устанавливает те же данные?

Другое правка:

В функции _findUser BaseAuthenticate я обнаружил следующее:

$result = ClassRegistry::init($userModel)->find('first', array(
    'conditions' => $conditions,
    'recursive' => $this->settings['recursive'],
    'fields' => $userFields,
    'contain' => $this->settings['contain'],
));

Итак, теперь вопрос в том, как мне установить $ this-> settings ['recursive'] и $ this-> settings ['contains'] из моего контроллера?

1 Ответ

0 голосов
/ 20 ноября 2018

Ваша модель пользователя связана с рядом других моделей через ассоциации Книга CakePHP .

Если не указано иное, CakePHP будет автоматически считывать связанные строки из других моделей при использовании пользователей.-> находка (...).Это видно из опубликованных вами данных (User.account_id = Account.id).

В вашем контроллере:

$user = $this->User->find('first',array('recursive'=>-1,...)); 

будет считывать только строки из модели пользователя.

$user = $this->User->find('first',array('recursive'=>1,...));

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

AuthComponent настроен (в основном) в AppController, где вы должны найти что-то вроде:

public $components = array(
    'Auth' => array(
        'authenticate' => array(
            'Basic' => array('userModel' => 'User'),
            'Form' => array('userModel' => 'User'),
            ...
        ),
        'authorize' => array('Controller'),
        'flash' => array('element' => 'popup_error', 'key' => 'flash', 'params' => array()),
        ...
    ),
)
...