Permalink
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
80 lines (65 sloc) 2.29 KB

ACL

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

Authorization: Bearer {token}.

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

AuthServiceInterface

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

use Swoft\Auth\Mapping\AuthServiceInterface;
use Swoft\Auth\AuthUserService;
use Psr\Http\Message\ServerRequestInterface;

/**
 * @Bean()
 */
class AuthService extends AuthUserService implements AuthServiceInterface
{
    /**
     * @Inject()
     * @var OrdinaryUserDAO
     */
    protected $ordinaryDao;

    public function auth(string $requestHandler, ServerRequestInterface $request): bool
    {
        $id = $this->getUserIdentity();
        $role = $this->getUserExtendData()['role'] ?? '' ;
        echo sprintf("你访问了: %s",$requestHandler);
        if($id){
            return true;
        }
        return false;
    }

}

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

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

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

use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Message\Bean\Annotation\Middleware;
use Swoft\Auth\Middleware\AclMiddleware;

/**
 * @Middleware(AclMiddleware::class)
 * @RequestMapping(route="/", method={RequestMethod::GET})
 */
public function index()
{
    $data = [
        'name' => 'Swoft',
        'repo' => 'https://github.com/swoft-cloud/swoft',
        'doc' => 'https://doc.swoft.org/',
        'doc1' => 'https://swoft-cloud.github.io/swoft-doc/',
        'method' => __METHOD__,
    ];
    return $data;
}

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

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