archict / firewall
控制资源访问
v0.2.0
2024-06-07 16:32 UTC
Requires
- php: >= 8.2
- archict/brick: ^0
- archict/router: ^0
- psr/http-message: ^2.0
Requires (Dev)
- archict/core: ^0.3
- guzzlehttp/psr7: ^2.6
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10
- slevomat/coding-standard: ^8.15
- squizlabs/php_codesniffer: ^3.9
- vimeo/psalm: ^5.22
This package is auto-updated.
Last update: 2024-09-02 06:16:59 UTC
README
控制您资源的访问
如何使用
大部分工作都在配置文件 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)。