問題描述
將 Auth 中間件應用於所有 Laravel 路由 (Apply Auth Middleware to All Laravel Routes)
當我在所有控制器中應用身份驗證中間件時,對除登錄和註冊之外的所有路由進行身份驗證的正確方法是什麼?有沒有辦法在一個地方應用身份驗證中間件並排除登錄、註冊路由?
參考解法
方法 1:
You can group all your authenticated routes like following, laravel provides a default middleware for auth and guest users
Route::group(['middleware' => ['auth']], function () {
Route::get('home', 'HomeController@index');
Route::post('save‑user', 'UserController@saveUser');
Route::put('edit‑user', 'UserController@editUser');
});
The above route names are just made up, please follow a proper naming convention for your routes and controllers. Also read about middlewares over here and about routing over here
方法 2:
You can add middleware to your whole web.php
route file by adding the middleware to your routes mapping in RouteServiceProvider
.
Go to app/Providers/RouteServiceProvider.php
and in mapWebRoutes()
, change middleware('web')
to middleware(['web', 'auth'])
:
protected function mapWebRoutes()
{
Route::middleware(['web', 'auth'])
‑>namespace($this‑>namespace)
‑>group(base_path('routes/web.php'));
}
This is (not?) totally unrelated but here's an example of a clean way to handle a lot of route files instead of throwing all your routes into a single web.php
file:
Create a new method mapAdminRoutes()
:
protected function mapAdminRoutes()
{
Route::middleware(['web', 'auth:admin'])
‑>namespace('App\Http\Controllers\Admin')
‑>name('admin.')
‑>group(base_path('routes/admin.php'));
}
Map it:
public function map()
{
$this‑>mapWebRoutes();
$this‑>mapAdminRoutes(); // <‑‑ add this
...
}
Create an admin.php
file in your routes
folder, then create your routes for Admin:
<?php
use Illuminate\Support\Facades\Route;
// This route's name will be 'admin.dashboard'
Route::get('dashboard', 'DashboardController@dashboard')‑>name('dashboard');
// This route's name will be 'admin.example'
Route::get('example', 'ExampleController@example')‑>name('example');
...
Now you can configure everything in 1 place, like prefix
, name
, middleware
and namespace
.
Check php artisan route:list
to see the results :)
方法 3:
you can apply middlewares in the routes.php file, what you need to do is to put all your routes on a group, and add the middleware 'auth' ( except the Auth::routes() which are already configured), for example :
Route::middleware(['first', 'second'])‑>group(function () {
Route::get('/', function () {
// Uses first & second Middleware
});
Route::get('user/profile', function () {
// Uses first & second Middleware
});
});
more information can be found in the docs: https://laravel.com/docs/5.7/routing#route‑group‑middleware
(by user3351236、Khan Shahrukh、emotality、Djellal Mohamed Aniss)