ACL

我们的权限配置是通过配合的Token进行实现的
只要我们的请求中包含如下的header

  1. Authorization: Bearer {token}.

那么 Auth组件 的中间件就可以识别并解析 Token了,下面看看如何实现

AuthServiceInterface

首先,实现我们自己的AuthService,继承自系统默认的AuthUserService并实现Swoft\Auth\Mapping\AuthServiceInterface接口

  1. use Swoft\Auth\Mapping\AuthServiceInterface;
  2. use Swoft\Auth\AuthUserService;
  3. use Psr\Http\Message\ServerRequestInterface;
  4. /**
  5. * @Bean()
  6. */
  7. class AuthService extends AuthUserService implements AuthServiceInterface
  8. {
  9. /**
  10. * @Inject()
  11. * @var OrdinaryUserDAO
  12. */
  13. protected $ordinaryDao;
  14. public function auth(string $requestHandler, ServerRequestInterface $request): bool
  15. {
  16. $id = $this->getUserIdentity();
  17. $role = $this->getUserExtendData()['role'] ?? '' ;
  18. echo sprintf("你访问了: %s",$requestHandler);
  19. if($id){
  20. return true;
  21. }
  22. return false;
  23. }
  24. }

config/beans/base.php 中添加如下代码把系统默认的Swoft\Auth\Mapping\AuthServiceInterface Bean 替换掉

  1. \Swoft\Auth\Mapping\AuthServiceInterface::class => [
  2. // 你的 AuthService 的完整命名空间
  3. 'class' => \App\Domain\User\Service\AuthService::class,
  4. ]

然后在你想要进行权限控制的 Controller上面添加 Swoft\Auth\Middleware\AclMiddleware::class 中间件,参考如下

  1. use Swoft\Http\Server\Bean\Annotation\RequestMapping;
  2. use Swoft\Http\Message\Bean\Annotation\Middleware;
  3. use Swoft\Auth\Middleware\AclMiddleware;
  4. /**
  5. * @Middleware(AclMiddleware::class)
  6. * @RequestMapping(route="/", method={RequestMethod::GET})
  7. */
  8. public function index()
  9. {
  10. $data = [
  11. 'name' => 'Swoft',
  12. 'repo' => 'https://github.com/swoft-cloud/swoft',
  13. 'doc' => 'https://doc.swoft.org/',
  14. 'doc1' => 'https://swoft-cloud.github.io/swoft-doc/',
  15. 'method' => __METHOD__,
  16. ];
  17. return $data;
  18. }

然后访问上面的路由 / ,就可以在控制台看到 你访问了: ...

AuthService 中的 auth 里面你可以获取用户的 ID,和自定义的附加字段,如我们上面例子里的 role 字段,这个前提是这个请求添加了授权的 Token