有条件地要求在Laravel 5.4中访问路由的身份验证

时间:2017-09-27 18:22:54

标签: laravel laravel-5 authorization

在Laravel 5.4中,我有一个Page模型,我想在DB中添加一个新字段,有条件地要求身份验证来浏览页面。

所以基本上我想要提供页面,每个人都可以访问某些页面,有些页面需要用户进行身份验证。如果需要对用户进行身份验证以查看该页面,则他将被重定向到登录页面。

我如何在Laravel中实现它?

我在考虑Gate,但我不确定如何混合未经身份验证和验证的规则。

谢谢你们!

EDIT 我在PageController

中找到了一种方法来实现我想要的东西
public function index($id)
{
    $page = Page::findOrFail($id);

    if ($page->require_auth && !Auth::check()) {
        return redirect()->guest('login');
    }

    return view('page', compact('page'));
}

但我仍然不确定这是最好的地方吗?

1 个答案:

答案 0 :(得分:0)

如果要对经过身份验证的用户进行一些页面限制,可以使用默认的auth中间件。

要使用默认值,请运行:

php artisan make:auth

这将创建:

  • 登录视图
  • 记住密码查看
  • “注册”查看
  • AuthController
  • 路由到每个视图+“操作”

然后,你可以简单地使用“middleware:auth”(检查:app / Http / Kernel.php来查看所有中间件)。

或者,您可以简单地创建自己的中间件:

php artisan make:middleware MyAuthMiddleware ## This generate a new middleware file inside app/Http/Middleware

你可以这样做:

<?php

namespace App\Http\Middleware;

use Closure;

class MyAuthMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!auth()->check()) {
            abort(403, 'Access denied');
        }
        return $next($request);
    }
}

之后,只需将此类的引用添加到Kernel.php(app / Http / Kernel.php)中。

<?php

// ....
protected $routeMiddleware = [
 'my-auth' => \App\Http\Middleware\MyAuthMiddleware::class
];

有关中间件的更多信息:https://laravel.com/docs/5.5/middleware