第一步 先吧名字變成我想變得 這裏有三處改動的地方。
php
再次刷新後發現依然可使用,絕對溜溜的跑起來。在這一步中,也堅決了個人一些使用想法,好比創造多箇中間件,每一個控制器都應該有一個相對應的,在這裏執行一些本身象處理的,在看到手冊上還可使用各類其餘的方法,包括執行順序的改變,這讓我心中各類意淫。今後代碼變得又能夠稍微高大上一點了。json
第二步 創建功能規則 配合Config配置中的自建文件,對訪問進行控制api
<?php
namespace apphttpmiddleware;
use thinkfacadeConfig;
use thinkfacadeRequest;
/**php框架
*/
class AdminLoginCheck
{安全
/** * handle 重寫處理請求對象的操做函數 * @param object Request $request 請求對象 * @param object \Closure $next 響應對象 * @return array 錯誤返回的信息 * code 返回碼 * msg 返回信息 * data 返回數據 * @return object 響應對象 */ public function handle($request, \Closure $next) { // 檢測配置,查看該接口服務是否被暫停使用 if (true !== Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_api')) // 若是結果不符合要求則返回錯誤信息 exit(json_encode(['code'=>1,'msg'=>'Interface_Pause_service','data'=>''])); // 檢測配置,是否執行請求驗證類型 if (false !== Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_request')) { // 登錄請求規則,傳入相應方法,查看該接口是否符合請求類需 $res = self::loginRequestRole(Request::action()); // 若是結果不符合要求則返回錯誤信息 if (true !== $res) exit(json_encode(['code'=>1,'msg'=>'Request_Type_Not_Matching','data'=>''])); } // 檢測配置,是否執行地址限制驗證 if (false !== Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_address')) { // 客戶端訪問地址限制請求規則 $res = self::loginAddressDispose(Request::ip()); // 若是結果不符合要求則返回錯誤信息 if (true !== $res) exit(json_encode(['code'=>1,'msg'=>'Address_Not_Access','data'=>''])); } // 格式化與處理前臺參數 $request = self::loginParamDispose(Request::action(),$request); // 繼續執行進入到控制器 return $next($request); } /** * loginRequestRole 請求類型驗證 * @param string $scene 根據路徑傳入方法名稱 * @return bool 驗證用戶訪問的接口是否符合預設的請求要求 */ protected static function loginRequestRole($scene) { switch ($scene) { // 登錄頁面請求驗證 case 'index': if (Request::isGet()) return true; else return false; break; // 登錄接口請求驗證 case 'login': if (Request::isPost() || Request::isAjax() || Request::isPjax()) return true; else return false; break; // 登錄接口請求驗證 case 'resetPassword': if (Request::isPost() || Request::isAjax() || Request::isPjax()) return true; else return false; break; // 默認驗證或者不存在的場景返回 default: return false; break; } } /** * loginAddressDispose 地址是否容許訪問 * @param string $address 須要傳入一個address地址 * @return string 返回錯誤信息 * @return bool 檢測正確返回真 */ protected static function loginAddressDispose($address) { // 讀取配置內的設置參數 $data = Config::get(Request::module().'.'.Request::action().'.'.Request::action().'_address_data'); // 若是配置信息address列表爲空則返回不能訪問 if (empty($data)) return false; // 循環地址列表信息解開連續address地址列表 foreach ($data as $key => $val) { if ($val == $address) return true; } // 若是繼續執行下去依然沒有 返回不能訪問 return false; } /** * loginParamDispose post內容與格式處理 * @param string $scene 須要前往的接口名稱 * @param object $request 請求的對象內容 * @return object 返回處理過的請求對象 */ protected static function loginParamDispose($scene,$request) { switch ($scene) { // 登錄頁面 case 'index': break; // 登錄接口請求參數處理 case 'login': // 前臺用戶傳入的參數進行調整轉換 $request->username = $request->param('user'); $request->password = $request->param('pass'); $request->captcha = $request->param('code'); // 對記住我進行處理 $remember = $request->param('remember'); if (null === $remember) $request->remember = 'shut'; else $request->remember = 'open'; break; // 重置密碼接口參數處理 case 'resetPassword': // 前臺用戶傳入的參數進行調整轉換 $request->username = $request->param('user'); $request->phone = $request->param('mobile'); $request->phonecode = $request->param('code'); $request->password = $request->param('pass'); $request->repassword = $request->param('repass'); break; // 默認接口或者不存在的場景返回 default: break; } return $request; }
}app
第一個問題是 中間件並非萬能的,只能作一些請求處理,並且是必須帶參的,千萬不要去作不符合要求的高級驗證,這裏最多的只是作一些前置驗證,讓數據安全或者讓數據飽滿框架
第二給問題是 不要在中間件中嘗試作不合時宜的動做,不要在中間件中執行超級複雜的代碼,若是你拿中間件作超級複雜的代碼或者超長運算,我估計能夠坑死不少人,這裏所說包括了儘可能少使用本身函數庫定義的函數代碼驗證 有些避不開的仍是可使用的,好比密碼加密這種相似的代碼函數