中间件和 beforeFilter 身份验证将不起作用
Middleware and beforeFilter auth won't work
我定义了一个资源路由组
Route::group(['prefix' => 'api/v1'], function() {
Route::resource('words', 'WordController');
});
我为所有这些路线创建了一个控制器。我想为所有请求设置基本身份验证所以我在WordController
的构造函数中添加:$this->beforeFilter('auth.basic');
但是没有效果。我仍然可以在不提供任何用户名和密码的情况下获取所有单词。有人知道为什么吗?
class WordController extends ApiController {
protected $wordTransformer;
function __construct(WordTransformer $wordTransformer)
{
$this->wordTransformer = $wordTransformer;
$this->beforeFilter('auth.basic');
//$this->middleware('auth.basic');
}
public function index()
{
$words = Word::all();
return $this->respond([
'words' => $this->wordTransformer->transformCollection($words->all())
]);
}
}
您可以试试下面的方法。在路由期间验证用户而不是控制器。
Route::get('home', array('before' => 'auth', 'do' => function()
{
// your action here
}));
Route::filter('auth',function(){
if(Auth::guest())
return Redirect::to('login');
});
如果您使用的是laravel 5,您可以使用中间件代替过滤器。使用中间件正在成为装饰路由的首选实践和思考方式。为什么你的代码不起作用,因为 auth.basic 是一种中间件而不是过滤器。
您可以在控制器中附加中间件,因为您正在使用 Route::group。
请参阅下面的代码如何附加它。
Route::group(['prefix' => 'api/v1', 'middleware' => 'auth.basic'], function() {
Route::resource('words', 'WordController');
});
您可以在上面的代码中看到使用中间件名称"auth.basic"。你怎么知道中间件。在使用中间件之前,您必须通过在 /app/Http/Kernel.php 中定义中间件来注册中间件。如果您打开该文件,您可以看到下面的代码。
/**
* The application's route middleware.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => 'App\Http\Middleware\Authenticate',
'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
];
我定义了一个资源路由组
Route::group(['prefix' => 'api/v1'], function() {
Route::resource('words', 'WordController');
});
我为所有这些路线创建了一个控制器。我想为所有请求设置基本身份验证所以我在WordController
的构造函数中添加:$this->beforeFilter('auth.basic');
但是没有效果。我仍然可以在不提供任何用户名和密码的情况下获取所有单词。有人知道为什么吗?
class WordController extends ApiController {
protected $wordTransformer;
function __construct(WordTransformer $wordTransformer)
{
$this->wordTransformer = $wordTransformer;
$this->beforeFilter('auth.basic');
//$this->middleware('auth.basic');
}
public function index()
{
$words = Word::all();
return $this->respond([
'words' => $this->wordTransformer->transformCollection($words->all())
]);
}
}
您可以试试下面的方法。在路由期间验证用户而不是控制器。
Route::get('home', array('before' => 'auth', 'do' => function()
{
// your action here
}));
Route::filter('auth',function(){
if(Auth::guest())
return Redirect::to('login');
});
如果您使用的是laravel 5,您可以使用中间件代替过滤器。使用中间件正在成为装饰路由的首选实践和思考方式。为什么你的代码不起作用,因为 auth.basic 是一种中间件而不是过滤器。
您可以在控制器中附加中间件,因为您正在使用 Route::group。 请参阅下面的代码如何附加它。
Route::group(['prefix' => 'api/v1', 'middleware' => 'auth.basic'], function() {
Route::resource('words', 'WordController');
});
您可以在上面的代码中看到使用中间件名称"auth.basic"。你怎么知道中间件。在使用中间件之前,您必须通过在 /app/Http/Kernel.php 中定义中间件来注册中间件。如果您打开该文件,您可以看到下面的代码。
/**
* The application's route middleware.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => 'App\Http\Middleware\Authenticate',
'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
];