archict/firewall

控制资源访问

安装: 0

依赖项: 0

建议者: 0

安全: 0

星星: 0

关注者: 1

分支: 0

开放问题: 5

类型:archict-brick

v0.2.0 2024-06-07 16:32 UTC

README

Tests

控制您资源的访问

如何使用

大部分工作都在配置文件 firewall.yml

providers:
  my_provider: \Class\Name\Of\My\User\Provider
access_control:
  - path: ^/admin # Path to match (a regex)
    provider: my_provider
    roles: [ "ADMIN" ] # Roles user need to have to see resources
    error: 404 # If user not authorized, then return this error code
  - path: ^/profile
    provider: my_provider
    roles: [ "USER" ]
    redirect_to: /login # If user not authorized, then return to this uri

让我们详细看看!

用户提供者

为了帮助防火墙获取当前用户,您需要给它提供一个用户提供者。

此砖块为您提供了接口 \Archict\Firewall\UserProvider

<?php

namespace Archict\Firewall;

interface UserProvider 
{
    public function getCurrentUser(ServerRequestInterface $request): UserWithRoles;
}

您传递给配置的类必须实现此接口。它可以有依赖项,如服务,它们将在实例化期间注入。

User 是由此砖块也提供的接口

<?php

namespace Archict\Firewall;

interface UserWithRoles
{
    /**
     * @return string[]
     */
    public function getRoles(): array;
}

访问控制

此配置标签必须包含一个规则数组。

每个规则至少必须有一个 path 标签。此标签定义要匹配的路径,它可以是与 Archict\router 中相同的规则的模式。

然后,您可以选择让防火墙检查用户是否有权访问资源(检查基于用户角色),或者实现您自己的检查器。

防火墙检查器

如果您选择使用防火墙检查器,那么您必须提供这两个标签

  • provider ➡ 前面定义的一个提供者
  • roles ➡ 字符串数组。用户必须拥有这些角色之一才能访问资源

然后,您可以使用以下规则之一(只有一个)来定义行为

  • error ➡ 返回的 HTTP 错误代码
  • redirect_to ➡ 返回带有指定 uri 的 301 响应

您自己的检查器

要使用您自己的检查器,您的类必须实现此接口

<?php

namespace Archict\Firewall;

interface UserAccessChecker
{
    public function canUserAccessResource(ServerRequestInterface $request): bool;
}

此方法返回 true,如果用户有权查看资源。它可以抛出异常,就像在 Archict\router 中定义的那样。实现此接口的接口可以在其构造函数中具有一些依赖项,它们将在实例化期间注入。

然后,您可以通过标签 checker 提供类名到您的规则中

access_control:
  - path: some/path
    checker: \My\Own\Checker

您还可以在您的返回 false 的情况下提供行为标签之一(见 Firewall checker)。