• 使用 Casbin 作为 ThinkPHP 的权限控制中间件


    PHP-Casbin 是一个强大的、高效的开源访问控制框架,它支持基于各种访问控制模型的权限管理。

    Think-Casbin 是一个专为 ThinkPHP5.1 定制的 Casbin 的扩展包,使开发者更便捷的在 thinkphp 项目中使用 Casbin。

     

    安装

    1. 创建 thinkphp 项目(如果没有):
    composer create-project topthink/think=5.1.* tp5
    1. 在 ThinkPHP 项目里,安装 Think-Casbin 扩展:
    composer require casbin/think-adapter
    1. 发布资源:
    php think casbin:publish

    这将自动创建 model 配置文件 config/casbin-basic-model.conf,和 Casbin 的配置文件 config/casbin.php

    1. 数据迁移:

    由于 Think-Casbin 默认将 Casbin 的策略(Policy)存储在数据库中,所以需要初始化数据库表信息。

    执行前,请确保数据库连接信息配置正确,如需单独修改 Casbin 的数据库连接信息或表名,可以修改 config/casbin.php 里的配置。

    php think casbin:migrate

    这将会自动创建 Casbin 的策略(Policy)表 casbin_rule

     

    中间件

    ThinkPHP 从 5.1.6+ 版本开始,正式引入中间件的支持。

    可以通过命令行指令快速生成中间件

    php think make:middleware Authorization

    这个指令会 application/http/middleware 目录下面生成一个 Authorization 中间件。

    在中间件中,获取当前用户名、URI、请求方法,通过 Casbin 验证权限:

     1 <?php
     2 
     3 namespace apphttpmiddleware;
     4 
     5 use Casbin;
     6 use thinkfacadeSession;
     7 
     8 class Authorization
     9 {
    10     public function handle($request, Closure $next)
    11     {
    12         // 当前登录用户名,这里以session为例
    13         // $user = Session::get('user_name') ?: 'test_user';
    14         $user = Session::get('user_name');
    15 
    16         $url = $request->url();
    17         $action = $request->method();
    18 
    19         if (!$user){
    20             return response()->data('Unauthenticated.')->code(401);
    21         }
    22 
    23         if (!Casbin::enforce($user, $url, $action)) {
    24             return response()->data('Unauthorized.')->code(403);
    25         }
    26 
    27         return $next($request);
    28     }
    29 }
     

    Casbin Model 配置

    configcasbin-basic-model.conf 配置文件:

     1 [request_definition]
     2 r = sub, obj, act
     3 
     4 [policy_definition]
     5 p = sub, obj, act
     6 
     7 [policy_effect]
     8 e = some(where (p.eft == allow))
     9 
    10 [matchers]
    11 m = r.sub == p.sub && keyMatch2(r.obj, p.obj) && r.act == p.act
     

    验证

    在执行授权之前,先在数据库 casbin_rule 表中添加一些默认的策略:

    idptypev0v1v2
    1 p test_user /users GET
    2 p test_user /users/:id GET

    添加路由及其中间件:

     1 Route::group('users', function () {
     2 
     3     Route::get('', function () {
     4         return 'Users data.';
     5     });
     6 
     7     Route::get('/:id', function ($id) {
     8         return 'User: '.$id;
     9     });
    10 
    11 })->middleware(apphttpmiddlewareAuthorization::class);

    先登录用户保存用户名到 SESSION ,可以访问 /users/users/1 验证一下权限。

     

    更多 API 参考

    • Management API
    • RBAC API
      • 多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的加群(点击→)677079770
  • 相关阅读:
    uboot的仓库在哪里?
    git如何查看执行过的历史git命令
    for(;;)和while(true)的区别
    CountDownLatch的理解和使用
    countDownLatch
    websocket @ServerEndpoint(value = "/websocket/{ip}")详解
    Java原子性操作之——Atomic包的原理分析
    CAS原理
    java线程池ThreadPoolExecutor的keepAliveTime=0时,表示超过core线程数的线程在空闲时立即结束!!!
    ThreadPoolExecutor 线程池Demo
  • 原文地址:https://www.cnblogs.com/a609251438/p/11892360.html
Copyright © 2020-2023  润新知