2015-03-12 4 views
1

Я довольно новичок в Joomla и Php в целом. Мне нужно понять, как Joomla выполняет операцию входа в систему. Ниже приведен фрагмент кода PHP, который выполняет операцию:Понимание логики логики Joomla

<form action="<?php echo JRoute::_('index.php?option=com_users&task=user.login'); ?>" method="post"> 

     <fieldset> 
      <?php foreach ($this->form->getFieldset('credentials') as $field): ?> 
       <?php if (!$field->hidden): ?> 
        <div class="login-fields"><?php echo $field->label; ?> 
        <?php echo $field->input; ?></div> 
       <?php endif; ?> 
      <?php endforeach; ?> 
      <?php if (JPluginHelper::isEnabled('system', 'remember')) : ?> 
      <div class="login-fields"> 
       <label id="remember-lbl" for="remember"><?php echo JText::_('JGLOBAL_REMEMBER_ME') ?></label> 
       <input id="remember" type="checkbox" name="remember" class="inputbox" value="yes" alt="<?php echo JText::_('JGLOBAL_REMEMBER_ME') ?>" /> 
      </div> 
      <?php endif; ?> 
     <button type="submit" class="button"><?php echo JText::_('JLOGIN'); ?></button> 
      <input type="hidden" name="return" value="<?php echo base64_encode($this->params->get('login_redirect_url', $this->form->getValue('return'))); ?>" /> 
      <?php echo JHtml::_('form.token'); ?> 
     </fieldset> 
    </form> 

В моем понимании, первая линия выполнить запрос POST, чтобы отправить имя пользователя и пароль для сервера. Кроме того, маркер сеанса должен быть извлечен после успешной проверки. Часть task=user.login означает, что она переводит вас в файл контроллера «пользователь» на функцию «login». \ components \ com_users \ controllers \ user.php и найти функцию login.I также понимаю, что у Joomla есть свой собственный метод проверки токена формы. Вы можете JSession::checkToken('post') or jexit(JText::_('JInvalid_Token')).

Однако мое понимание процесса входа в систему состоит в том, что эта функция login должна отправить запрос POST на сервер с именем пользователя и паролем (учетные данные), а затем сервер будет проверять и отправлять сеансToken.

Проблема в том, что я не мог понять в нижней функции, где учетные данные отправляются через запрос POST? и где получено sessionToken? Я предположил, что должен быть URL-адрес для отправки POST, где это?

public function login() 
{ 
    JSession::checkToken('post') or jexit(JText::_('JInvalid_Token')); 

    $app = JFactory::getApplication(); 

    // Populate the data array: 
    $data = array(); 
    $data['return'] = base64_decode(JRequest::getVar('return', '', 'POST', 'BASE64')); 
    $data['username'] = JRequest::getVar('username', '', 'method', 'username'); 
    $data['password'] = JRequest::getString('password', '', 'post', JREQUEST_ALLOWRAW); 
    $lang = JRequest::getVar('lang','post'); 

    // Set the return URL if empty. 
    if (empty($data['return'])) { 
     $data['return'] = 'index.php?option=com_users&view=profile'; 
    }else { 
     if($lang){ 
      $lang = mb_substr($lang, 0, 2); 
      $data['return'] .= '&lang='.$lang; 
     } 
    } 


    // Set the return URL in the user state to allow modification by plugins 
    $app->setUserState('users.login.form.return', $data['return']); 

    // Get the log in options. 
    $options = array(); 
    $options['remember'] = JRequest::getBool('remember', false); 
    $options['return'] = $data['return']; 

    // Get the log in credentials. 
    $credentials = array(); 
    $credentials['username'] = $data['username']; 
    $credentials['password'] = $data['password']; 

    // Perform the log in. 
    if (true === $app->login($credentials, $options)) { 
     // Success 
     $app->setUserState('users.login.form.data', array()); 
     $app->redirect(JRoute::_($app->getUserState('users.login.form.return'), false)); 
    } else { 
     // Login failed ! 
     $data['remember'] = (int)$options['remember']; 
     $app->setUserState('users.login.form.data', $data); 
     $app->redirect(JRoute::_('index.php?option=com_users&view=login', false)); 
    } 
} 

Наша цель - подражать запросу с использованием JavaScript, чтобы я мог выполнять вход в систему с помощью внешнего мобильного приложения. Другими словами, мне нужно написать ту же логику в JavaScript, так что я могу войти на сайт с мобильного приложения ..

+0

Возможно, вы захотите рассмотреть вопрос об этом на странице [Joomla Stack Exchange] (http://joomla.stackexchange.com) – Lodder

ответ

1

файлы, которые вы должны исследовать, являются:

libraries/legacy/application/application.php 
libraries/joomla/factory.php 
libraries/joomla/user/user.php 

Ключевой момент входа это:

// Perform the log in. 
if (true === $app->login($credentials, $options)) 

В котором:

@see libraries/legacy/application/application.php 
$app = instance of JApplication 

Как говорится в комментарии, метод входа в систему Japplication выполняет вход в систему, генерирует сеанс и сохраняет данные пользователя.

Чтобы быть более точным в JApplication :: login Вы найдете эту строку.

$user = JFactory::getUser(); 

И именно в этом месте, которое инициированный сеанс.

Смежные вопросы