<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 簡介 前面提到判斷用戶登錄用`Yii::$app->user->isGuest`來確定是否登錄 但是通常大多數功能都要登錄后才使用,那如果每一個站內功能都寫這個if判斷肯定是不現實 其實大家也能想到一些技巧來實現,比如定義一個控制器基類,在基類的init方法里做isGuest判斷,所有控制器繼承它就行了 # 方法1:官方推薦,用訪問過濾器來判斷 其實這并不是我最推薦的方式,但為了順利把官方的基礎知識學一下,我覺得有必要掌握一下這招 官方在過濾器封裝好了一套登錄校驗邏輯,我們可以直接拿來配置一下就能用上,并且對于需求不斷變化的應用來說,用這個比較好擴展 還記得[過濾器](http://www.kkh86.com/it/yii2/guide-base-filter.html)這篇文章里提到的過濾器吧,在做登錄授權的時候就是使用官方自帶的[yii\\filters\\AccessControl](http://www.yiichina.com/doc/api/2.0/yii-filters-accesscontrol)這個“訪問控制”過濾器 好了我們假設有個控制器要用,那就在這個控制器里重寫父類的behaviors方法: ~~~php public function behaviors(){ return [ 'access' => [ 'class' => 'yii\filters\AccessControl', 'rules' => [ //檢測規則 [ //第1條規則 'roles' => ['@'], //角色集合,@表示登錄用戶 'allow' => true, //是否允許訪問 ], [ //第2條規則 'actions' => ['login', 'register'], //針對本控制器的哪些方法ID生效,這兩個ID就是針對actionLogin和actionRegister兩個方法生效 'roles' => ['?'], //? 表示未登錄用戶 'allow' => true, //允許未登錄用戶訪問 ], ], ], ]; } ~~~ 配置好后未登錄狀態下可以運行控制器的login和register方法,不能運行其它方法,會返回HTTP 403,這是訪問控制過濾器的基本使用,晚點再慢慢深入掌握它 * #### 訪問過濾器規則的封裝 雖然重寫behaviors方法使用過濾器就能實現登錄檢測,但這代碼行數也不比自己寫邏輯的少,而且還要每個控制器去配置這還得了? 那當然還是封裝一個基礎控制器,其它控制器繼承它來實現繼承過濾器規則咯 但這樣增加了繼承體系總感覺有點不好是吧,還可以這樣,定義一個Trait,里面就是behaviors方法: ~~~php namespace app\lib; trait TraitCheckLogin{ public function behaviors(){ return [ 'access' => [ 'class' => 'yii\filters\AccessControl', 'rules' => [ //檢測規則 [ //第1條規則 'roles' => ['@'], //角色集合,@表示登錄用戶 'allow' => true, //是否允許訪問 ], [ //第2條規則 'actions' => ['login', 'register'], //針對本控制器的哪些方法ID生效,這兩個ID就是針對actionLogin和actionRegister兩個方法生效 'roles' => ['?'], //? 表示未登錄用戶 'allow' => true, //允許未登錄用戶訪問 ], ], ], ]; } } ~~~ 然后在各個控制器里加上`use TraitCheckLogin;`就可以了(因為大部分程序員少接觸trait這個知識點所以這樣講了) * * * * #### 配置登錄地址 像上面這樣使用了AccessControl過濾器后,在未登錄的情況下訪問時不會自動跳到登錄頁面,這樣的用戶體驗不好 這里我們其實只要給user組件配置一下`loginUrl`就能讓它自動跳過去了: ~~~php 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, 'loginUrl' => '/login.html', //!!!重點!!! //'loginUrl' => ['site/show-login'], //可以用數組,底層會拿去Url::to處理 //'loginUrl' => 'http://xxx.com/oauth.html', //甚至是絕對地址 ], ~~~ # 方法2:在app初始化的時候就做登錄檢測,適合中小型的典型應用 追加到配置文件第一層key(相關知識點:[在配置里定義事件](http://www.kkh86.com/it/yii2-adv/guide-base-listen-event-with-config.html)): ~~~php 'on beforeAction' => function($event){ if(!Yii::$app->user->isGuest){ //已經登錄就隨便他訪問吧 return; } $isCommonAccessAction = in_array($event->action->controller->module->requestedRoute, [ 'user/register', 'user/login', 'site/error', 'site/captcha', ]); //是否不登陸可以訪問 if(!$isCommonAccessAction){ $event->isValid = false; Yii::$app->response->redirect(Yii::$app->user->loginUrl); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看