【问题标题】:(Laravel 8) How to check if user permissions are something (No-package, No Spatie)(Laravel 8)如何检查用户权限是否正确(无包,无 Spatie)
【发布时间】:2021-05-31 19:14:57
【问题描述】:

我得到了用户、角色、权限和角色用户、角色权限。

我想做的是:

  • 在用户模式中检查请求用户的权限是什么。

【问题讨论】:

    标签: laravel laravel-8


    【解决方案1】:

    Laravel 建议 gate policy 进行授权。最好的方法是学习它:

    https://laravel.com/docs/8.x/authorization

    但如果您想使用自己的方法。您可以使用中间件并将其添加到您想要保护它们的所有路由中。

    php artisan make:middleware MyauthMiddleware
    

    把这段代码放进去:

     <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    class MyauthMiddleware
    {
    
    public function handle($request, Closure $next,$permission_id)
    {
        if (Auth::user()) { // if user is logined
            // Do what you want from your tables. 
            // Here is the most important part you should use.
            //I wrote sample bellow:
            $roles = RoleUser::where('user_id',Auth::user()->id)->get();
            foreach($roles as $role_user){
                if($role_user->role->permision->id == $permission_id){
                    return $next($request);
                }
            }
        }
        return redirect('/');
    }
    

    然后在 app/Http/Kernel.php 类的 $middleware 属性中添加新的中间件类。

    protected $routeMiddleware = [
        //....
        'myauthcheck' => \App\Http\Middleware\MyauthMiddleware::class,
    ];
    

    然后在你的路由上设置中间件:

    Route::group(['middleware' => 'myauthcheck:832'], function () {     
    //your routes here related to 832 permission_id
    });
    

    【讨论】:

    • 好的,我明白了。但即使我这样做。我必须写什么来检查用户是否具有(...)权限?我知道如何检查用户角色,但权限对用户没有数据透视表,所以有点混乱。
    • @ChrisServ 我编辑了我的答案并添加了一些细节。再检查一遍。
    • 为了使用这条线$role-&gt;permission-&gt;id,你应该在Role模型中拥有hasManypermission的关系。
    • Column not found: 1054 Unknown column 'user_id' in 'where Clause' (SQL: select * from roles where user_id = 1) 我做错了什么?
    • 在我的回答中使用 RoleUser 模型而不是 Role 类
    【解决方案2】:

    如果我没听错,您正在寻找一种查询数据库的方法。不幸的是,你不能直接使用 Laravel 的 Eloquent ORM 来做到这一点,并且需要一些额外的努力,在我看来这不是很有效。所以这就是 SQL 的方式:

    SELECT `permissions`.* FROM `permissions` JOIN `role_permission` ON (`permissions`.`id` = `role_permission`.`permission_id`) WHERE `role_permission`.`role_id` IN (SELECT `role_id` FROM `user_role` WHERE `user_role`.`user_id` = $USER_ID)
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 2020-07-02
      相关资源
      最近更新 更多