路由驗(yàn)證
本小節(jié)主要介紹如何在路由驗(yàn)證請(qǐng)求的合法性,主要包括請(qǐng)求的變量規(guī)則、url后綴、路由中間件。
1.變量規(guī)則
這里以之前獲取學(xué)生列表接口為例,若要在路由層面增加變量的過濾規(guī)則,可以使用pattern
方法,如下:
//獲取學(xué)生列表接口
Route::get('students/:name', 'app\controller\Study\StudentController@getStudents')->pattern(['name' => '[\w|\-]+']);
如下圖所示:
Tips: 其中
:name
表示路由后面可以跟變量name
,[\w|\-]+
是一個(gè)正則表達(dá)式,對(duì)name
字段匹配。
下面在 getStudents
方法中打印 name
變量,并返回正確的請(qǐng)求結(jié)果:
/**
* 獲取學(xué)生列表
* @return \think\response\Json
* @throws \think\db\exception\DbException
*/
public function getStudents()
{
halt($this->request->param('name'));
//每頁條數(shù)
$size = (int)$this->request->param('size', 15);
$students = StudentModel::where('status', 1)->order('created_at DESC')->paginate($size);
return json($students);
}
如下圖所示:
請(qǐng)求正確結(jié)果如下圖:
請(qǐng)求不滿足正則匹配的要求如下圖:
2.URL 后綴驗(yàn)證
若想要某個(gè)請(qǐng)求的 url
的后綴滿足某種后綴可以使用 ext()
方法,如下:
//獲取學(xué)生列表接口
Route::get('students/:name', 'app\controller\Study\StudentController@getStudents')->ext('html');
如下圖所示:
下面演示返回正確的情況:
下面演示返回錯(cuò)誤的情況:
3.路由中間件
首先使用如下命令生成一個(gè)中間件 Auth
:
php think make:middleware Check
如下圖所示:
然后Auth
中處理特定的請(qǐng)求,如下圖貼出簡(jiǎn)單的權(quán)限驗(yàn)證的情況:
/**
* 處理請(qǐng)求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
$token = $request->header('access-token');
if($token != '123456abc'){
throw new HttpException(401,"沒有訪問權(quán)限");
}
return $next($request);
}
如下圖所示:
然后定義如下路由:
//獲取學(xué)生列表接口
Route::get('students/:name', 'app\controller\Study\StudentController@getStudents')->ext('html')->middleware(\app\Middleware\Auth::class);
如下圖所示:
如下圖演示返回正確的請(qǐng)求:
如下圖演示返回錯(cuò)誤的請(qǐng)求:
4.小結(jié)
本小節(jié)介紹了常見的路由驗(yàn)證,其中變量規(guī)則驗(yàn)證一般用于驗(yàn)證 url
中表示請(qǐng)求參數(shù)的變量,url
后綴驗(yàn)證主要用于驗(yàn)證不滿足指定后綴的 url
請(qǐng)求,如 .html
、txt
,路由中間件一般用于處理中間層的業(yè)務(wù)邏輯,如 權(quán)限驗(yàn)證
。
Tips: 代碼倉庫:https://gitee.com/love-for-poetry/tp6