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

2024-06-28

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

Role:

id  |   name
1   |  school
2   | transport

权限:

id  |   name                   |  controller         | routes
1   |  view-class-result       |  ApiController      | getClassResult
2   |  view-student-result     |  ApiController      | studentResult
3   |  download-student-result |  ApiController      | donwloadSchoolTemplate

权限角色

role_id |  permission_id
1            1
1            2
1            3

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

目前我的路线如下:

//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');
   });
});

我不希望对上述路线进行硬编码。我如何从数据库中获取此路线。像下面这样的东西。但不知道该怎么做。

在路线文件中,

$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}');
      });

   }
}

谢谢。


最好的想法是使用中间件参数 创造中间件 call 检查权限那么你必须将该中间件注册到你的应用程序/Http/kernel.php仅此文件您需要检查下面的代码

Your 内核.php file

protected $routeMiddleware = [    
        'checkPermission' => \App\Http\Middleware\CheckPermission::class,
    ];

检查权限.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();

        }
    }

Your Route file

 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');

   }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel:根据访问控制列表设置动态路由 的相关文章

  • Codeigniter 错误:不允许您尝试上传的文件类型

    如果我上传一个csv文件 没有问题localhost一切工作正常 但是当我在实时服务器上上传我的应用程序并上传csv文件然后抛出此错误 The filetype you are attempting to upload is not all
  • 如何在 Laravel 8 中实现记住我?

    我有一个登录表单和一个记住我复选框 我希望如果用户在上次登录时选中 记住我 复选框 则自动填写用户名和密码 但目前不起作用 我正在使用 Laravel 中构建的 LoginController 登录控制器
  • Active Record 库的 CodeIgniter 挂钩

    我需要一些帮助来理解 CodeIgniter 的钩子逻辑 以使代码适应我的需要 这一页 https www codeigniter com user guide general hooks html https www codeignite
  • 如何获得DiVs等级?

    html div class div class p strong span style color FF0000 Content1 span strong p p style text align center Content2 img
  • PayPal REST API:通过重定向 URL 或 Webhook 调用履行订单/付款?

    我正在致力于将 PayPal REST API 集成到我的 Symfony 2 Web 应用程序中 我不确定完成订单 付款的正确时间 地点 与金额 客户数据等其他参数一起 我将两个 URL 传输到 PayPal API 一个是接受付款时用户
  • 重定向至 2 页

    我有一个 PHP 页面 我想先将其重定向到一个页面 例如 google com 然后再重定向到另一个页面 例如 bing com 为此 我使用以下方法 header Location http google com header Locat
  • 发帖到 FB 粉丝专页时如何解决“不支持的发帖请求”?

    我有一个可以执行 ff 的脚本 发布指向用户时间线 墙的链接 以管理员身份发布指向用户页面的链接 发布到用户的个人资料页面工作正常 然而 发布到粉丝页面的行为很奇怪 我我能够发帖但我回来了 不支持的发布请求 错误 我已经搜索过这个问题并尝试
  • 执行通过 AJAX 加载的 Javascript [重复]

    这个问题在这里已经有答案了 可能的重复 如何执行动态加载的 JavaScript 块 https stackoverflow com questions 75943 how do you execute a dynamically load
  • 如何从 PHP 中的两个日期范围中提取每周一和每两周的周一?

    我正在使用臭名昭著的 jQuery UI 的日期选择器 并在我的表单中选择两个日期的范围 首先代表的是starting另一个代表日期end date 我现在需要的是算法 一些提示和方向或帮助者来计算这两个日期之间的每个星期一 例如 star
  • MySQL/SQL 检索文本字段的前 40 个字符?

    如何从 mysql 数据库表中检索文本字段 但不是整个文本 只是少数 40 个左右的字符 这可以在 sql 中完成还是需要使用 php 来完成 基本上我想做的是显示前 x 个字符 然后让用户单击它来查看完整内容 SELECT LEFT fi
  • 一段时间后取消设置会话

    我正在建立一个在线订票网站 在此 我将执行以下操作 用户使用其座位号搜索公共汽车 数据库中的座位号已更新为temp seat book Y 如果他预订机票并付款 他的状态将更新为final ticket book Y 现在我想删除该字段te
  • 在 Apache 虚拟主机之间传输会话数据

    如何将 PHP 会话数据从一个 Apache 虚拟主机传递到另一台 我当前正在运行 Apache 2 2 17 和 PHP 5 3 3 并且我已经设置了一台主机来管理单点登录应用程序 我需要将其传递给运行单独应用程序的另外两台虚拟主机 这是
  • 将数组项合并到字符串中[重复]

    这个问题在这里已经有答案了 如何将所有数组项合并为一个字符串 Use the implode功能 http php net manual en function implode php 例如 fruits array apples pear
  • 使用PHP检测哪个htaccess用户登录?

    我正在构建一个上传功能 以便我认识的人可以安全 轻松地向我发送文件 但我想这样设计 当我的一个朋友用their登录 这将是 htaccess登录 我可以在 PHP 中建立该文件并将其文件记录到与其帐户关联的数据库中 简而言之 我需要 PHP
  • 当用户使用 Internet Explorer 时重定向到新页面

    我使用下面的代码将使用 Internet Explorer 的用户重定向到新页面 但显然代码有问题 因为当我使用 Internet Explorer 时该网站不再加载 这是代码 由于我不知道我做错了什么 如果有人可以发布使用正确编码的正确方
  • MVC:我应该在哪里格式化数据?

    我从模型 带有数据的数组 获取数据 并且需要以特定格式显示 我需要迭代数组 格式化数据然后显示它 我应该在哪里格式化数据以显示 在模型 控制器还是视图中 谢谢 对数组的迭代并显示数据是在视图中完成的 因此我也会在视图中进行格式化 如果格式化
  • 如何对 bcmath 数字进行向上、向下和舍入?

    我需要模仿的确切功能ceil http php net manual en function ceil php floor http www php net manual en function floor php and round ht
  • 我可以在 javascript 中使用 php 吗?

    初学者的问题 我可以在 JavaScript 中使用 PHP 吗 例如在 jquery 中 triggers eq 1 post PHP 在服务器端执行 JavaScript 在客户端执行 但是你可以像这样打印 PHP 变量 trigger
  • 有没有办法在 PHP 中创建匿名对象

    我可以开始使用如下代码吗 new Controllers ServiceController gt fbdump 所以我不必创建一个 var 来执行单个方法 是的 但是您需要添加一组括号 因为 gt 优先级高于new new Control
  • 以同样的方式根据编号对数组进行洗牌

    我正在运行一个测验制作网站 我希望以打乱的顺序向用户显示问题的答案 我试图avoid如果我要随机打乱答案 则存储向用户呈现答案的顺序 我想以可预测的方式打乱答案 这样我以后就可以用同样的方式重复随机播放 显示结果时 我认为我可以按某个数字对

随机推荐