zoukankan      html  css  js  c++  java
  • 使用 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
  • 相关阅读:
    LeetCode Missing Number (简单题)
    LeetCode Valid Anagram (简单题)
    LeetCode Single Number III (xor)
    LeetCode Best Time to Buy and Sell Stock II (简单题)
    LeetCode Move Zeroes (简单题)
    LeetCode Add Digits (规律题)
    DependencyProperty深入浅出
    SQL Server存储机制二
    WPF自定义RoutedEvent事件示例代码
    ViewModel命令ICommand对象定义
  • 原文地址:https://www.cnblogs.com/a609251438/p/11892360.html
Copyright © 2011-2022 走看看