在Laravel中验证用户角色并保护路由

 嘉心面包-1908 发布于 2023-01-12 18:16

我从这里的人那里得到了建议并尝试了Laravel,我一直在尝试创建一个用户身份验证系统.我无法使用Eloquent将我熟悉的PHP工作翻译成Laravel.

我在这里要做的是识别用户,他们的角色,如果用户具有管理员的角色,他们可以访问路由/管理员

我知道我可以使用像Entrust这样的包,但这并不能帮助我学习.

我为用户和角色创建了模型.我还有一个名为role_user的查找表,其中包含user_id和role_id.

User.php我有

public function roles(){

    return $this->belongsToMany('Role', 'users_roles');

}

Role.php我有

public function users()
{
    return $this->belongsToMany('User', 'users_roles');
}

我知道我是否用过

$roles = user::find(1)->roles;
return ($roles);

它将确实返回正确的用户ID(1)和分配给该用户的角色.现在我正在努力解决的问题是如何选择管理员角色,只有当用户拥有此权限时才会允许访问/ admin

路线应该基本上是

Route::get('admin', function()
{

    return View::make('admin.index');

 })->before('auth');

我无法确定如何/在哪里/我应该首先检查管理员角色以及如何将其应用于auth检查以仅允许管理员访问该路由.

任何帮助赞赏.

背风处

2 个回答
  • 您已使用auth过滤器,因此您应该检authapp/filters.php文件中的过滤器:

    Route::filter('auth', function($route, $request)
    {
        // Login check (Default)
        if (Auth::guest()) return Redirect::guest('login');
    
        // Admin check
        if(!in_array('admin', Auth::user()->roles->toArray())) {
            return Redirect::to('/'); // Redirect home page
        }
    
    });
    

    您可以使用不同的过滤器,例如:

    Route::get('admin', function()
    {
        return View::make('admin.index');
    
    })->before('isAdmin');
    

    在以下位置声明自定义isAdmin过滤器app/filters.php:

    Route::filter('isAdmin', function($route, $request)
    {
        if(!Auth::check()) return Redirect::guest('login');
        if( !in_array('admin', Auth::user()->roles->toArray()) ) {
            return Redirect::to('/'); // Redirect home page
        }
    
    });
    

    2023-01-12 18:18 回答
  • 对于Laravel 5,使用中间件:

    创建新的中间件

    # php artisan make:middleware RoleMiddleware
    

    检查用户角色 - 如果角色无效,则重定向

    // app/Http/Middleware/RoleMiddleware.php
    
    class RoleMiddleware
    {
        public function handle($request, Closure $next, $role)
        {
            if (! $request->user()->hasRole($role)) {
                // Redirect...
            }
    
            return $next($request);
        }
    }
    

    添加键以分配路由 - 也可以创建全局

    // app/Http/Kernel.php
    
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'role' => \App\Http\Middleware\RoleMiddleware::class, // new
    ];
    

    保护路线

    // app/Http/routes.php
    
    Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
        // routes for editor
    }]);
    

    2023-01-12 18:18 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有