Laravel:根据访问控制列表设置动态路由

use*_*153 12 php laravel laravel-5.5

我正在使用自己的逻辑构建具有身份验证和授权的REST APIJWT.它工作得很好.现在,我想根据角色和权限动态设置路由.假设我有数据库结构,如:

角色:

id  |   name
1   |  school
2   | transport
Run Code Online (Sandbox Code Playgroud)

权限:

id  |   name                   |  controller         | routes
1   |  view-class-result       |  ApiController      | getClassResult
2   |  view-student-result     |  ApiController      | studentResult
3   |  download-student-result |  ApiController      | donwloadSchoolTemplate
Run Code Online (Sandbox Code Playgroud)

Permission_role

role_id |  permission_id
1            1
1            2
1            3
Run Code Online (Sandbox Code Playgroud)

现在,我想根据数据库中的角色和权限创建路由.

目前我的路线似乎是:

//All JWT authentication API goes here
Route::group(['middleware' => 'jwt.auth'], function() {
   Route::get('user', 'ApiController@getAuthUser');
   Route::get('invalidate', 'ApiController@invalidate');

   //All authorized API goes here
   Route::group(['middleware' => 'ability:school,view-class-result,true'], function() {
       Route::post('classResult', 'ApiController@getClassResult');
   });
   Route::group(['middleware' => 'ability:school,view-student-result,true'], function() {
       Route::post('studentResult', 'ApiController@studentResult');
   });
   Route::group(['middleware' => 'ability:school,download-student-result,true'], function() {
       Route::post('getStudentExamResult', 'ApiController@downloadSchoolTemplate');
   });
});
Run Code Online (Sandbox Code Playgroud)

我不希望上面的路由被硬编码.如何从数据库中获取此路由.像下面的东西.但是不知道该怎么做.

在路径文件中,

$a = User:all();
foreach($a->roles as $value){
   foreach($value->permission as $val){

      Route::group(['middleware' => 'ability:{$value->name},{$val->name},true'], function() {
         Route::post('{$val->controller}', '{$val->controller}@{$val->method}');
      });

   }
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Ham*_*raj 11

最好的想法是使用中间件参数创建中间件调用CheckPermission然后你必须将该中间件注册到你的app/Http/kernel.php文件中,只有你需要检查下面的代码

你的kernel.php文件

protected $routeMiddleware = [    
        'checkPermission' => \App\Http\Middleware\CheckPermission::class,
    ];
Run Code Online (Sandbox Code Playgroud)

CheckPermission.php

    <?php

    namespace App\Http\Middleware;
    use Closure;
    use DB;

    class CheckPermission
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next,$permission_name)
        {
            //first check that name in your db
            $permission = DB::table('Permission')->where('name',$permission_name)->first()
            if($permission){
              //here you have to get logged in user role
              $role_id = Auth::user()->role;
              ## so now check permission
              $check_permission = DB::table('Permission_role')->where('role_id',$role_id)->where('permission_id',$permission->id)->first();
              if($check_permission){
                 return $next($request);
              }
              //if Permission not assigned for this user role show what you need
            }
            // if Permission name not in table then do what you need 
            ## Ex1 : return 'Permission not in Database';
            ## Ex2 : return redirect()->back();

        }
    }
Run Code Online (Sandbox Code Playgroud)

您的路线文件

 Route::group(['middleware' => 'jwt.auth'], function() {
        Route::post('classResult', 'ApiController@getClassResult')->middleware('checkPermission:view-class-result');
        Route::post('studentResult', 'ApiController@studentResult')->middleware('checkPermission:view-student-result');
        Route::post('getStudentExamResult', 'ApiController@downloadSchoolTemplate')->middleware('checkPermission:download-student-result');

   }
Run Code Online (Sandbox Code Playgroud)


小智 0

因此,您可以做的就是让您的角色名称accountants成为.env文件中键入的,并且每个角色名称都相同。

如果您想在不久的将来更改它,您可以在.env文件中手动更改它,或者您可以通过在Laravel 函数之一上编写的php代码在.env文件中进行更改。