具有 laravel 5 的角色,如何仅允许管理员访问某些根

Roles with laravel 5, how to allow only admin access to some root

我遵循本教程:https://www.youtube.com/watch?v=kmJYVhG6UzM 目前我可以检查我的 blade 如果用户是管理员还是不是这样:

{{ Auth::user()->roles->toArray()[0]['role'] }}
HI ADMIN
@endif

如何让我的路线只对管理员用户可用?

使用中间件并检查管理员用户。

Route::get('admin', ['middleware' => 'checkadmin', function()
{

}]);

现在创建中间件并验证管理员用户。

您需要为您的路由创建一个中间件。

使用:php artisan make:middleware AdminMiddleware.

您会在您的中间件文件夹中找到一个同名的新文件。

将您的逻辑放在您的中间件中,例如

public function handle($request, Closure $next)
{
    if(Auth::check())
    {
        return $next($request);
    }
    else
    {
        return view('auth.login')->withErrors('You are not logged in');
    }

}

在中间件中完成逻辑后,您可以在路由中调用它或使中间件应用于所有路由。

如果你想把它添加到所有路由中,去Kernel.php然后把它添加到$middleware数组中,例如

protected $middleware = [
    'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
    'Illuminate\Cookie\Middleware\EncryptCookies',
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
    'Illuminate\Session\Middleware\StartSession',
    'Illuminate\View\Middleware\ShareErrorsFromSession',
    'App\Http\Middleware\VerifyCsrfToken',
    'App\Http\Middleware\AdminMiddleware',
];

如果只想将其添加到特定路由,请将其添加到 $routeMiddleware 变量并将别名添加到路由。例如

protected $routeMiddleware = [
    'auth' => 'App\Http\Middleware\Authenticate',
    'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
    'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
    'admin' => 'App\Http\Middleware\AdminMiddleware',
];

然后您可以将其作为过滤器添加到路线中,例如

Route::get('admin/profile', ['middleware' => 'admin', function()
{

}]);

有关更多信息,请访问文档:

http://laravel.com/docs/master/middleware

编辑

对此的改进是使用 PHP 5.6

中引入的可变参数函数

http://php.net/manual/en/migration56.new-features.php

您不必为每个权限集制作一个中间件,您可以执行以下操作

权限中间件

namespace App\Http\Middleware;

use Closure;
use \App\Models\Role;
class PermissionMiddleware
{
    // Pass parameters to this middleware
    public function handle($request, Closure $next, ...$permitted_roles)
    {

        //Get a users role
        $role = new Role;
        $role_name = $role->getUserRoleByName();
        foreach($permitted_roles as $permitted_role) {
            if($permitted_role == $role_name) {
                return $next($request);
            }
        }
        return redirect()->back()->withErrors('You do not have the required permission');

    }
}

注意...$permitted_roles

Route::get('admin/profile', ['middleware' => 'PermissionMiddleware:Admin,Marketing', function()
{

}]);

您现在可以为一个中间件指定尽可能多的角色,而不是使用中间件参数创建多个

文档 https://laravel.com/docs/5.3/middleware#middleware-parameters

假设您的用户 table 中有一个名称为 isAdmin 的列,其默认值为 0(假)

您可以使用 laravel 中的中间件授予特殊访问权限,就像您使用 laravel 中的 auth 中间件授予登录用户访问权限一样。 现在您需要使用以下命令创建一个中间件:

php artisan make:middleware AdminMiddleware

在您的 Kernel.php 中,您需要将此行添加到 protected $routeMiddleware

'admin' => \App\Http\Middleware\AdminMiddleware::class,

在您的中间件文件夹中,您有 AdminMiddleware 文件。 因为你需要把你的逻辑 在这种情况下,这可能取决于您

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class RoleMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        if(Auth::user()->isAdmin == '1') // is an admin
        {
            return $next($request); // pass the admin
        }

        return redirect('/'); // not admin. redirect whereever you like

    }
}

现在在你的路由中你必须使用这个中间件传递 url 这是它的样子

Route::get('/iamanadmin', ['middleware' => 'admin', function() {
    return view('iamanadmin');
}]);