我如何在Laravel 5中有条件地要求身份验证?


How can I require authentication in Laravel 5 on a conditional basis?

我有一个应用程序使用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方法。

这是一个抽象的想法,但你现在可以实现自己的一个,所以查看文档以获取更多信息。