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

Yii2-基本应用程序模板中的模块登录,yii2,Yii2,使用“基本”应用程序模板,设置独立于主站点登录的模块登录的正确方法是什么 例如,我有一个需要登录的“管理员”模块。我还需要一个主站点的用户登录 我已经做了以下工作: 使用gii工具创建admin模块 在管理模块文件夹中创建了模型文件夹 将LoginForm.php和User.php放置在此文件夹中(还更新了这些文件中的命名空间声明) 添加了AccessControl行为和登录/注销操作到modules\admin\controllers\DefaultController.php 更新了conf

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

例如,我有一个需要登录的“管理员”模块。我还需要一个主站点的用户登录

我已经做了以下工作:

  • 使用
    gii
    工具创建
    admin
    模块
  • 管理
    模块文件夹中创建了
    模型
    文件夹
  • LoginForm.php
    User.php
    放置在此文件夹中(还更新了这些文件中的命名空间声明)
  • 添加了
    AccessControl
    行为和登录/注销操作到
    modules\admin\controllers\DefaultController.php
  • 更新了
    config\web.php
    ,如下所示:

    'modules' => [
        'admin' => [
            'class' => 'app\modules\admin\Module',
        ],
    ],
    
    public function init()
    {
        parent::init();
    
        Yii::$app->set('user', [
            'class' => 'yii\web\User',
            'identityClass' => 'app\modules\admin\models\User',
            'enableAutoLogin' => true,
            'loginUrl' => ['admin/default/login'],
        ]);
    
        Yii::$app->set('session', [
            'class' => 'yii\web\Session',
            'name' => '_adminSessionId',
        ]);
    }
    
  • 更新的
    app\modules\admin\Module.php
    如下:

    'modules' => [
        'admin' => [
            'class' => 'app\modules\admin\Module',
        ],
    ],
    
    public function init()
    {
        parent::init();
    
        Yii::$app->set('user', [
            'class' => 'yii\web\User',
            'identityClass' => 'app\modules\admin\models\User',
            'enableAutoLogin' => true,
            'loginUrl' => ['admin/default/login'],
        ]);
    
        Yii::$app->set('session', [
            'class' => 'yii\web\Session',
            'name' => '_adminSessionId',
        ]);
    }
    
  • 我遇到的问题是,如果我在未登录时尝试访问管理员页面,它会显示登录表单(这是正确的)。然而,登录后,它只是将我重定向回主站点。它应该将我重定向到我试图访问的管理页面

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

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

    goBack()
    如果没有为用户设置
    returnUrl
    ,则默认为
    homeUrl

    为什么不直接重定向

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

    用户组件允许您设置返回URL,getter解释道:
    此方法从会话读取返回URL。它通常由登录操作使用,登录操作可能会调用此方法将浏览器重定向到成功身份验证后的位置。

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

    不推荐:处理完数据后,您可以依赖以下推荐人(在某些情况下不起作用):
    返回Yii::$app->request->referer$this->redirect(Yii::$app->request->referer):$this->goHome()
    或者代替goHome,它基本上重定向到可以在模块初始化期间设置的app->homeUrl,您可以说
    $this->redirect('your/admin/index')


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

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

    'backendUrlManager'=>[
            'class' => 'yii\web\urlManager',
            'enablePrettyUrl'=>true,
            'showScriptName'=>false,
            'baseUrl'=>'/admin',
        ],
    
    在DefaultController.php中,它具有以下内容(默认代码):


    返回Yii::$app->getResponse()->重定向(Yii::$app->backendUrlManager->baseUrl)

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

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

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

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

    namespace app\modules\admin;
    
    class Module extends \yii\base\Module
    {
        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';
            .....
    
        }
    }
    

    切换到高级应用程序,它就是为此而设计的,将基本应用程序转换为高级应用程序非常容易。稍后你会感谢Yii的好人。这将始终重定向到固定页面。它需要重定向到用户试图访问的任何页面(如果他们尚未登录)。如果用户登录到管理登录页面,您可以设置返回url<代码>Yii::$app->user->returnUrl=Yii::$app->request->referer我会添加一些检查以确保推荐人不会重定向到外部站点。