【问题标题】:Roles with laravel 5, how to allow only admin access to some rootlaravel 5的角色,如何只允许管理员访问某些root
【发布时间】:2015-05-17 15:05:25
【问题描述】:

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

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

我怎样才能让我的路由只对管理员用户可用?

【问题讨论】:

    标签: php laravel-5


    【解决方案1】:

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

    使用: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

    【讨论】:

    • 得到这个错误:Class AdminMiddleware 不存在
    • 答案是正确的,请修复这个:'middleware' => 'AdminMiddleware',它应该是'middleware' => 'admin',
    • 如果你知道答案请在这里帮忙:stackoverflow.com/questions/29062680/…
    【解决方案2】:

    假设您的 users 表中有一个名为 isAdmin 的列,其默认值为 0 (false)

    您可以使用 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');
    }]);
    

    【讨论】:

    • False 应该用 0 来表示... 1 是 True
    • @ColinStadig 感谢您的更正。已更正。
    【解决方案3】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2011-01-09
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多