<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                后臺管理頁面的訪問權限 在cmf的simplewind/cmf/controller/AdminBaseController.php文件中,使用函數checkAccess($userid)判斷此登陸用戶是否有權限訪問此頁面。 /** * 檢查后臺用戶訪問權限 * @param int $userId 后臺用戶id * @return boolean 檢查通過返回true */ private function checkAccess($userId) { // 如果用戶id是1,則無需判斷 if ($userId == 1) { return true; } $module = $this->request->module(); $controller = $this->request->controller(); $action = $this->request->action(); $rule = $module . $controller . $action; $notRequire = ["adminIndexindex", "adminMainindex"]; if (!in_array($rule, $notRequire)) { return cmf_auth_check($userId); } else { return true; } } 在這個函數里首先判斷用戶是不是超級管理員用戶,如果是,不用檢查權限,直接放行。如果訪問的是后臺主界面等所有人都可以訪問的公共界面,也直接放行。否則調用cmf_auth_check()函數檢查權限。 轉到cmf_auth_check()函數看看 ``` /** * 檢查權限 * @param $userId int 要檢查權限的用戶 ID * @param $name string|array 需要驗證的規則列表,支持逗號分隔的權限規則或索引數組 * @param $relation string 如果為 'or' 表示滿足任一條規則即通過驗證;如果為 'and'則表示需滿足所有規則才能通過驗證 * @return boolean 通過驗證返回true;失敗返回false */ function cmf_auth_check($userId, $name = null, $relation = 'or') { if (empty($userId)) { return false; } if ($userId == 1) { return true; } $authObj = new \cmf\lib\Auth(); if (empty($name)) { $request = request(); $module = $request->module(); $controller = $request->controller(); $action = $request->action(); $name = strtolower($module . "/" . $controller . "/" . $action); } return $authObj->check($userId, $name, $relation); } ``` 但是這個函數并沒有什么實質內容,只是將當前的路徑當成參數調用另一個類里的函數,所以繼續跟蹤。 \cmf\lib\Auth()->check() /** * 檢查權限 * @param $name string|array 需要驗證的規則列表,支持逗號分隔的權限規則或索引數組 * @param $uid int 認證用戶的id * @param $relation string 如果為 'or' 表示滿足任一條規則即通過驗證;如果為 'and'則表示需滿足所有規則才能通過驗證 * @return boolean 通過驗證返回true;失敗返回false */ public function check($uid, $name, $relation = 'or') { if (empty($uid)) { return false; } if ($uid == 1) { return true; } if (is_string($name)) { $name = strtolower($name); if (strpos($name, ',') !== false) { $name = explode(',', $name); } else { $findAuthRuleCount = Db::name('auth_rule')->where([ 'name' => $name ])->count(); if ($findAuthRuleCount == 0) {//沒有規則時,不驗證! return true; } $name = [$name]; } } $list = []; //保存驗證通過的規則名 $groups = Db::name('RoleUser') ->alias("a") ->join('__ROLE__ r', 'a.role_id = r.id') ->where(["a.user_id" => $uid, "r.status" => 1]) ->column("role_id"); if (in_array(1, $groups)) { return true; } if (empty($groups)) { return false; } $rules = Db::name('AuthAccess') ->alias("a") ->join('__AUTH_RULE__ b ', ' a.rule_name = b.name') ->where(["a.role_id" => ["in", $groups], "b.name" => ["in", $name]]) ->select(); foreach ($rules as $rule) { if (!empty($rule['condition'])) { //根據condition進行驗證 $user = $this->getUserInfo($uid);//獲取用戶信息,一維數組 $command = preg_replace('/\{(\w*?)\}/', '$user[\'\\1\']', $rule['condition']); //dump($command);//debug @(eval('$condition=(' . $command . ');')); if ($condition) { $list[] = strtolower($rule['name']); } } else { $list[] = strtolower($rule['name']); } } if ($relation == 'or' and !empty($list)) { return true; } $diff = array_diff($name, $list); if ($relation == 'and' and empty($diff)) { return true; } return false; } 這才是真正的權限檢查函數啊…首先還是例行的判斷是否超級管理員,再判斷傳入的需要驗證的路徑是否有多組(以逗號分隔),如果有多組,分隔開后作為數組存入原變量。如果只有一組,直接查詢表auth_rule其中是否有這條驗證規則,如果沒有就不用驗證了,直接返回true。 接下來聯合RoleUser和__ROLE__兩張表,當表中有當前用戶且用戶狀態正常時,返回當前用戶的role_id(可能有多個角色,所以為數組),如果當前用戶擁有超級管理員角色,放行;如果什么角色也沒有,拒絕請求。 在繼續聯合AuthAccess和__AUTH_RULE__兩張表,找出此用戶此次請求訪問的頁面中有權限訪問的頁面,存入$rules數組中。遍歷$rules數組,如果當前行的condition列不為空,………..(沒看懂);如果condition為空,則將當前行的name值存入數組list中,表示已經通過權限驗證的頁面。 如果list數組中不為空且驗證規則的連接詞為or(即只要有一個驗證條件通過驗證),則返回true,放行;如果連接詞為and,則對比傳入的規則列表與通過驗證的規則列表(即$name與$list),若兩個數組一致,則表明所有驗證列表都通過了驗證,返回true。否則,其他所有情況都返回false,拒絕請求。
                  <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>

                              哎呀哎呀视频在线观看