2015-06-05 27 views
2

我有一个使用Laravel 5的开箱即用认证的应用程序。只有当名为“批准”的字段等于1时,我才需要验证控制器的显示方法。如何在条件基础上要求在Laravel 5中进行身份验证?

如何在有条件的基础上使用中间件进行身份验证,以便未经身份验证的用户可以访问已批准列等于1,但只有通过验证的用户可以看到已批准的参赛等于0

我的构造目前看起来是这样的:

public function __construct(){ 
    $this->middleware('auth', ['only' => ['edit', 'destroy', 'approve', 'markRecovered']]); 
} 
+0

此“已批准”列出现在哪个表中?用户表或其他表? – Bogdan

+0

新闻条目的另一个表,控制器被称为NewsControlller – KinsDotNet

回答

3

您可以创建自己的中间件,而不是使用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

这是一个抽象的想法,但你现在可以实现你自己的一个,所以check the documentation欲了解更多信息。

+0

这个答案几乎解决了我的问题。不幸的是,这不是具有批准字段的用户,而是新闻文章。我只希望用户能够看到已批准== 0的新闻文章,如果他们已登录。有关如何进行此类过滤的任何想法? – KinsDotNet

+0

好吧,没有什么比这么难的了,只有你需要根据你的'handle'方法的需求来提取代码。只需检查文章的核准字段并进行判定。 –

+0

我从您的示例中了解如何过滤数据。我想我正在努力的是在获取当前的新闻文章来检查该领域。无论如何,我都会批准您的答案,但如果您对获得该文章有任何意见,我将不胜感激。 – KinsDotNet

相关问题