Yii2-基本应用程序模板中的模块登录



使用"基本"应用程序模板,设置独立于主站点登录的模块登录的正确方法是什么?

例如,我有一个"admin"模块,它需要登录。我还需要一个主站点的用户登录。

我做了以下工作:

  1. 使用gii工具创建admin模块
  2. admin模块文件夹中创建了models文件夹
  3. LoginForm.phpUser.php放置在此文件夹中(还更新了这些文件中的命名空间声明)
  4. AccessControl行为和登录/注销操作添加到modulesadmincontrollersDefaultController.php
  5. 更新configweb.php如下:

    'modules' => [
        'admin' => [
            'class' => 'appmodulesadminModule',
        ],
    ],
    
  6. 更新appmodulesadminModule.php如下:

    public function init()
    {
        parent::init();
        Yii::$app->set('user', [
            'class' => 'yiiwebUser',
            'identityClass' => 'appmodulesadminmodelsUser',
            'enableAutoLogin' => true,
            'loginUrl' => ['admin/default/login'],
        ]);
        Yii::$app->set('session', [
            'class' => 'yiiwebSession',
            'name' => '_adminSessionId',
        ]);
    }
    

我遇到的问题是,如果我在未登录时尝试访问管理页面,它会显示登录表单(这是正确的)。然而,登录后,它只是将我重定向回主站点。它应该会将我重定向到我试图访问的管理页面。

DefaultController.php中,它有以下(默认代码):

if ($model->load(Yii::$app->request->post()) && $model->login())
    return $this->goBack();

正确的方法是什么,这样我就可以独立登录管理模块和主站点了?我不想使用"高级应用程序模板",因为这会增加一些不必要的复杂性。

用户组件允许您设置returnUrl,getter解释道:This method reads the return URL from the session. It is usually used by the login action which may call this method to redirect the browser to where it goes after successful authentication.

推荐:在处理数据之前,通过调用Yii::$app->user->setReturnUrl(Url::current());设置returnUrl(这将存储用户在会话中所在的页面,此外,在将其传递到会话之前,您可以使用Url::current()操作GET参数),并让框架发挥其魔力。

不推荐:处理数据后,您可以按照以下方式依赖referr(在某些情况下不起作用)return Yii::$app->request->referrer ? $this->redirect(Yii::$app->request->referrer) : $this->goHome();,而不是goHome,它基本上重定向到模块初始化期间可以设置的app->homeUrl,你可以说$this->redirect('your/admin/index');

我建议在模块初始化期间设置['homeUrl' => 'your/admin/index'],因为您可能还需要它来实现其他功能,Yii2也将其用作某些重定向的"后备"。

最好的方法是在管理模块中创建新的控制器,该控制器应该具有登录和注销操作因为,将来你可能会添加一些额外的逻辑

在该登录操作中,您可以使用相同的LoginForm。

您可以在该登录操作中指定重定向url。

管理模块类可以如下所示:

namespace appmodulesadmin;
class Module extends yiibaseModule
{
    public $layout = 'main';
    public $defaultRoute = 'main/index';
    public function init()
    {
        parent::init();
        Yii::$app->errorHandler->errorAction = '/admin/main/error';
        Yii::$app->user->loginUrl = '/admin/main/login';
        .....
    }
}
如果未设置用户的returnUrl,则goBack()默认为homeUrl

为什么不直接重定向?

if ($model->load(Yii::$app->request->post()) && $model->login())
    return $this->redirect(['myadminmodule']);

转到config/web.php并将其添加到组件中

'backendUrlManager'=>[
        'class' => 'yiiweburlManager',
        'enablePrettyUrl'=>true,
        'showScriptName'=>false,
        'baseUrl'=>'/admin',
    ],

在DefaultController.php中,它有以下(默认代码):

if ($model->load(Yii::$app->request->post()) && $model->login())

return Yii::$app->getResponse()->redirect(Yii::$app->backendUrlManager->baseUrl);

最新更新