我有一个应用程序使用Laravel 5的开箱即用的身份验证。只有当称为"approved"的字段等于1时,我需要对控制器的show方法进行身份验证。
如何在有条件的基础上使用中间件进行身份验证,使未经身份验证的用户可以访问其approved列等于1的条目,但只有经过身份验证的用户才能看到approved列等于0的条目。
我的构造函数现在看起来像这样:
public function __construct(){
$this->middleware('auth', ['only' => ['edit', 'destroy', 'approve', 'markRecovered']]);
}
您可以创建自己的中间件,而不是使用Laravel
的默认auth
中间件,在这种情况下,您可以创建一个中间件,如'checkApproval',使用如下:
php artisan make:middleware checkApproval
然后在你的app/Http/Middleware
目录中,你会发现新的中间件创建,它将包含包括handle
方法的基本结构,所以现在你可以在这个中间件的handle
方法中编写代码来检查user
的状态和approved
字段,然后重定向到login
页面,如果条件不匹配或允许访问。这里有一个基本的思想:
use Illuminate'Contracts'Auth'Guard;
class CheckPermission implements Middleware {
protected $auth;
public function __construct(Guard $auth)
{
$this->auth = $auth;
}
public function handle($request, Closure $next)
{
if($this->auth->guest() && !$this->checkApproval($request))
{
return redirect('login');
}
return $next($request);
}
protected function checkApproval($request)
{
// Get the auth/logged in user
// $user = $request->user();
// Get a parameter from route
// $id = $request->route()->parameter('id')
// Check the approved field here and return true or false
}
}
现在在app/Http/Kernel.php
文件中为中间件分配一个简写密钥。默认情况下,该类的$routeMiddleware
属性包含与Laravel
一起包含的中间件的条目。要添加自己的,只需将其附加到此列表并将其分配给key
以在route/controller
中使用,例如,checkApproval
,因此在auth
的位置,您可以将checkApproval
用于控制器中的view
方法。
这是一个抽象的想法,但你现在可以实现自己的一个,所以查看文档以获取更多信息。