繁体   English   中英

了解Joomla登录逻辑

[英]Understanding Joomla login logic

一般而言,我对Joomla和Php还是陌生的。 我需要了解Joomla如何执行登录操作。 以下是执行该操作的php代码段:

<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意味着它将您带到控制器文件“ user”到功能“ login”。 \\ components \\ com_users \\ controllers \\ user.php并找到函数login。我也了解到Joomla有自己的方法来检查表单令牌。 您可以JSession::checkToken('post') or jexit(JText::_('JInvalid_Token'))

但是,我对登录过程的理解是,此功能login应使用用户名和密码(凭证)将POST请求发送到服务器,然后服务器将进行验证并发回sessionToken。

问题是,在以下功能中我无法理解,凭证是通过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编写相同的逻辑,以便可以从移动应用程序登录网站。

您需要调查的文件是:

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();

正是在这个地方初始化了会话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM