repository = $repository; } /** * 列表页面 * * @return Grid */ protected function grid() { return Grid::make($this->repository, function (Grid $grid) { $grid->column('id', 'ID')->sortable(); $grid->column('name', '名称'); $grid->column('client_id', '客户端ID')->copyable(); $grid->column('client_secret', '客户端密钥')->copyable(); $grid->column('redirect_uri', '回调地址'); $grid->column('grant_types', '授权类型')->display(function ($grantTypes) { return implode(', ', $grantTypes ?? []); }); $grid->column('scope', '权限范围')->display(function ($scopes) { return implode(', ', $scopes ?? []); }); $grid->column('created_at', '创建时间'); $grid->column('updated_at', '更新时间'); // 过滤器 $grid->filter(function (Grid\Filter $filter) { $filter->equal('id'); $filter->like('name', '名称'); $filter->equal('client_id', '客户端ID'); }); // 工具栏 $grid->tools(function (Grid\Tools $tools) { $tools->append(new \App\Module\OAuth\Admin\Tools\TokenStats()); }); }); } /** * 详情页面 * * @param int $id * @return Show */ protected function detail($id) { return Show::make($id, $this->repository, function (Show $show) { $show->field('id'); $show->field('name', '名称'); $show->field('client_id', '客户端ID'); $show->field('client_secret', '客户端密钥'); $show->field('redirect_uri', '回调地址'); $show->field('grant_types', '授权类型')->as(function ($grantTypes) { return implode(', ', $grantTypes ?? []); }); $show->field('scope', '权限范围')->as(function ($scopes) { return implode(', ', $scopes ?? []); }); $show->field('created_at'); $show->field('updated_at'); // 显示关联的令牌 $show->relation('tokens', '访问令牌', function ($grid) { $grid->model()->orderBy('created_at', 'desc'); $grid->column('access_token', '访问令牌')->limit(20); $grid->column('user_id', '用户ID'); $grid->column('expires_at', '过期时间'); $grid->column('created_at', '创建时间'); }); }); } /** * 表单页面 * * @return Form */ protected function form() { return Form::make($this->repository, function (Form $form) { $form->display('id'); $form->text('name', '名称')->required(); if ($form->isCreating()) { $form->hidden('client_id'); $form->hidden('client_secret'); $form->submitted(function (Form $form) { $form->client_id = bin2hex(random_bytes(20)); $form->client_secret = bin2hex(random_bytes(20)); }); } else { $form->display('client_id', '客户端ID'); $form->display('client_secret', '客户端密钥'); } $form->url('redirect_uri', '回调地址')->required(); $form->multipleSelect('grant_types', '授权类型') ->options([ 'authorization_code' => '授权码模式', 'implicit' => '简化模式', 'password' => '密码模式', 'client_credentials' => '客户端模式', 'refresh_token' => '刷新令牌', ]) ->required(); $form->tags('scope', '权限范围') ->help('输入权限名称后按回车添加'); $form->display('created_at'); $form->display('updated_at'); }); } /** * 令牌管理页面 * * @param Content $content * @param string $clientId * @return Content */ #[Get('clients/{client}/tokens', name: 'oauth.clients.tokens')] public function tokens(Content $content, $clientId) { return $content->title('令牌管理') ->description('查看和管理访问令牌') ->body(function ($body) use ($clientId) { $grid = new Grid(new OAuthRepository); $grid->model() ->whereHas('tokens', function ($query) use ($clientId) { $query->where('client_id', $clientId); }); $grid->column('access_token', '访问令牌'); $grid->column('user_id', '用户ID'); $grid->column('expires_at', '过期时间'); $grid->column('created_at', '创建时间'); $grid->actions(function (Grid\Displayers\Actions $actions) { $actions->disableEdit(); $actions->disableView(); }); $body->append($grid); }); } }