zoukankan      html  css  js  c++  java
  • 权限控制库 Casbin 在 Slim 中的应用

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

    Slim 是一个PHP微框架,可帮助您快速编写简单但功能强大的Web应用程序和API。

    Casbin 可用作 Slim Framework 中的一个授权中间件。

    认证

    先认证,后授权。

    这里我们使用 HTTP Basic Authentication.

    slim-basic-auth 提供了 PSR-7 和 PSR-15 基本身份验证中间件,您可以使用composer进行安装: composer require tuupola/slim-basic-auth

    $app->add(new HttpBasicAuthentication([
    	'users' => [
    	    'root' => 't00r',
    	    'somebody' => 'passw0rd',
    	],
    	'before' => function ($request, $arguments) {
    	    return $request->withAttribute('user', $arguments['user']);
    	},
    ]));
    

    Casbin 授权中间件

    本示例实现了授权中间件。

    它首先获取当前已认证的user,当前请求的urimethod,然后使用Casbin 去权限决策。

    
    namespace AppMiddleware;
    
    use PsrHttpMessageServerRequestInterface as Request;
    use PsrHttpServerRequestHandlerInterface as RequestHandler;
    use SlimPsr7Response;
    use CasbinEnforcer;
    
    class Authorization
    {
        /**
         * Authorization middleware invokable class.
         *
         * @param ServerRequest  $request PSR-7 request
         * @param RequestHandler $handler PSR-15 request handler
         *
         * @return Response
         */
        public function __invoke(Request $request, RequestHandler $handler): Response
        {
            $e = new Enforcer('config/rbac_model.conf', 'config/policy.csv');
    
            $user = $request->getAttribute('user');
            $uri = $request->getUri();
            $action = $request->getMethod();
    
            if ($user && !$e->enforce($user, $uri->getPath(), $action)) {
                $response = new Response();
                $response->withStatus(403)->getBody()->write('Unauthorized.');
    
                return $response;
            }
    
            $response = $handler->handle($request);
    
            return $response;
        }
    }
    
    

    Model文件config/rbac_model.conf 内容如下:

    [request_definition]
    r = sub, obj, act
    
    [policy_definition]
    p = sub, obj, act
    
    [role_definition]
    g = _, _
    
    [policy_effect]
    e = some(where (p.eft == allow))
    
    [matchers]
    m = g(r.sub, p.sub) && keyMatch2(r.obj, p.obj) && r.act == p.act
    

    策略文件config/policy.csv内容如下:

    p, root, /, GET
    p, root, /users, GET
    p, root, /users/:id, GET
    

    创建路由

    $app->get('/', function (Request $request, Response $response) {
        $response->getBody()->write('Hello Casbin !');
        return $response;
    });
    
    $app->group('/users', function (Group $group) {
        $group->get('', ListUsersAction::class);
        $group->get('/{id}', ViewUserAction::class);
    });
    

    Casbin 骨架应用

    完整的代码 : Casbin skeleton application with Slim Framework 4.

    它让使用 Slim Framework 4 配置新的 Casbin 骨架应用程序变得容易快捷。

  • 相关阅读:
    基于开源SuperSocket实现客户端和服务端通信项目实战
    WinForm基于插件开发实现多项配置存储
    WinForm多线程实现HTTP网络检测工具
    .NET开源分布式日志框架ExceptionLess实战演练(公开版)
    让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
    .NET基于Eleasticsearch搭建日志系统实战演练
    Spring-Bean配置-使用外部属性文件(转)
    spring事务的隔离级别(透彻理解)
    Spring事务传播机制与隔离级别(转)
    SQL语句200条(转)
  • 原文地址:https://www.cnblogs.com/techone/p/11772048.html
Copyright © 2011-2022 走看看