OAuthClientController.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. namespace App\Module\OAuth\AdminControllers;
  3. use App\Module\OAuth\Models\OAuthClient;
  4. use App\Module\OAuth\Repositories\OAuthRepository;
  5. use Dcat\Admin\Form;
  6. use Dcat\Admin\Grid;
  7. use Dcat\Admin\Show;
  8. use Dcat\Admin\Http\Controllers\AdminController;
  9. use Dcat\Admin\Layout\Content;
  10. use Spatie\RouteAttributes\Attributes\Get;
  11. use Spatie\RouteAttributes\Attributes\Resource;
  12. #[Resource('oauth-clients', except: ['destroy'])]
  13. class OAuthClientController extends AdminController
  14. {
  15. protected $repository;
  16. public function __construct(OAuthRepository $repository)
  17. {
  18. $this->repository = $repository;
  19. }
  20. /**
  21. * 列表页面
  22. *
  23. * @return Grid
  24. */
  25. protected function grid()
  26. {
  27. return Grid::make($this->repository, function (Grid $grid) {
  28. $grid->column('id', 'ID')->sortable();
  29. $grid->column('name', '名称');
  30. $grid->column('client_id', '客户端ID')->copyable();
  31. $grid->column('client_secret', '客户端密钥')->copyable();
  32. $grid->column('redirect_uri', '回调地址');
  33. $grid->column('grant_types', '授权类型')->display(function ($grantTypes) {
  34. return implode(', ', $grantTypes ?? []);
  35. });
  36. $grid->column('scope', '权限范围')->display(function ($scopes) {
  37. return implode(', ', $scopes ?? []);
  38. });
  39. $grid->column('created_at', '创建时间');
  40. $grid->column('updated_at', '更新时间');
  41. // 过滤器
  42. $grid->filter(function (Grid\Filter $filter) {
  43. $filter->equal('id');
  44. $filter->like('name', '名称');
  45. $filter->equal('client_id', '客户端ID');
  46. });
  47. // 工具栏
  48. $grid->tools(function (Grid\Tools $tools) {
  49. $tools->append(new \App\Module\OAuth\Admin\Tools\TokenStats());
  50. });
  51. });
  52. }
  53. /**
  54. * 详情页面
  55. *
  56. * @param int $id
  57. * @return Show
  58. */
  59. protected function detail($id)
  60. {
  61. return Show::make($id, $this->repository, function (Show $show) {
  62. $show->field('id');
  63. $show->field('name', '名称');
  64. $show->field('client_id', '客户端ID');
  65. $show->field('client_secret', '客户端密钥');
  66. $show->field('redirect_uri', '回调地址');
  67. $show->field('grant_types', '授权类型')->as(function ($grantTypes) {
  68. return implode(', ', $grantTypes ?? []);
  69. });
  70. $show->field('scope', '权限范围')->as(function ($scopes) {
  71. return implode(', ', $scopes ?? []);
  72. });
  73. $show->field('created_at');
  74. $show->field('updated_at');
  75. // 显示关联的令牌
  76. $show->relation('tokens', '访问令牌', function ($grid) {
  77. $grid->model()->orderBy('created_at', 'desc');
  78. $grid->column('access_token', '访问令牌')->limit(20);
  79. $grid->column('user_id', '用户ID');
  80. $grid->column('expires_at', '过期时间');
  81. $grid->column('created_at', '创建时间');
  82. });
  83. });
  84. }
  85. /**
  86. * 表单页面
  87. *
  88. * @return Form
  89. */
  90. protected function form()
  91. {
  92. return Form::make($this->repository, function (Form $form) {
  93. $form->display('id');
  94. $form->text('name', '名称')->required();
  95. if ($form->isCreating()) {
  96. $form->hidden('client_id');
  97. $form->hidden('client_secret');
  98. $form->submitted(function (Form $form) {
  99. $form->client_id = bin2hex(random_bytes(20));
  100. $form->client_secret = bin2hex(random_bytes(20));
  101. });
  102. } else {
  103. $form->display('client_id', '客户端ID');
  104. $form->display('client_secret', '客户端密钥');
  105. }
  106. $form->url('redirect_uri', '回调地址')->required();
  107. $form->multipleSelect('grant_types', '授权类型')
  108. ->options([
  109. 'authorization_code' => '授权码模式',
  110. 'implicit' => '简化模式',
  111. 'password' => '密码模式',
  112. 'client_credentials' => '客户端模式',
  113. 'refresh_token' => '刷新令牌',
  114. ])
  115. ->required();
  116. $form->tags('scope', '权限范围')
  117. ->help('输入权限名称后按回车添加');
  118. $form->display('created_at');
  119. $form->display('updated_at');
  120. });
  121. }
  122. /**
  123. * 令牌管理页面
  124. *
  125. * @param Content $content
  126. * @param string $clientId
  127. * @return Content
  128. */
  129. #[Get('clients/{client}/tokens', name: 'oauth.clients.tokens')]
  130. public function tokens(Content $content, $clientId)
  131. {
  132. return $content->title('令牌管理')
  133. ->description('查看和管理访问令牌')
  134. ->body(function ($body) use ($clientId) {
  135. $grid = new Grid(new OAuthRepository);
  136. $grid->model()
  137. ->whereHas('tokens', function ($query) use ($clientId) {
  138. $query->where('client_id', $clientId);
  139. });
  140. $grid->column('access_token', '访问令牌');
  141. $grid->column('user_id', '用户ID');
  142. $grid->column('expires_at', '过期时间');
  143. $grid->column('created_at', '创建时间');
  144. $grid->actions(function (Grid\Displayers\Actions $actions) {
  145. $actions->disableEdit();
  146. $actions->disableView();
  147. });
  148. $body->append($grid);
  149. });
  150. }
  151. }