管理者サイトのエンドポイントについて

前提

現在LaravelをAPIサーバーとして、認証にLaravel Sanctumを使ってNextjsでフロントエンドの構築を行なっています。

  • バックエンド → api.ドメイン (EC2 auto scale) ...リポジトリA
  • フロントエンド(要ログイン) → app.ドメイン (Vercel isg + csr + ssr) ...リポジトリB
  • ランディングページ(非ログイン) → ドメイン (Vercel ssg + isg) ...リポジトリC

ここまで全く問題なく所謂よくある設計です。≒ ベストプラクティス

さらにマルチログインに関してもguardを使うことでユーザー用と管理者用でログインセッションを分けることができます


ここからが質問内容であり
管理者サイトを作るための選択肢がいくつか存在します。

1. Laravel製のリポジトリAで管理しbladeファイルを返す

api.ドメイン/admin以降にアクセスした場合、bladeファイルを返します

php [web.route]

1Route::middleware([])->group(function () {2 Route::prefix('admin')->group(function(){3 Route::get('/', function(){4 return blade file 5 });6 });7});

メリット

  • 他2つに比べてリポジトリが増えないので管理が楽。
  • ユーザーが操作するようなリッチな機能や操作性も必要なく、サービスクラスやリポジトリクラスを使い回すことができる。
  • サーバーが増えない。

デメリット

  • api.ドメイン/adminというapi感があるURLなのにbladeが帰ってくる。
  • URLを知ってるとユーザーがアクセスできてしまう。ログインページが表示されるだけでそもそもダサい。

追加されるエンドポイント

  • api.ドメイン/admin ~

2. nextjs製のリポジトリDを新たに作り管理する

admin.ドメインにNextjsを置き、
api.ドメイン/adminに対しリクエストを行いjsonファイルをNextjsで処理

php [web.route]

1Route::middleware([])->group(function () {2 Route::prefix('admin')->group(function(){3 Route::get('/', function(){4 return json 5 });6 });7});

メリット

  • バックエンドとフロントエンドの書き方が変わらない。 ( 現状と同じようにバックエンドの人はjson返せばいい、フロントエンドはjson受け取ってjsxに流し込むだけでいい )
  • なんかかっこいい

デメリット

  • 他2つに比べてコード量が多い。
  • わざわざvercelで管理するほどのものなのか?
  • リポジトリが増える。
  • URLを知ってるとユーザーがアクセスできてしまう。ログインページが表示されるだけでそもそもダサい。
  • admin用のAPIエンドポイントが存在することがバレる

追加されるエンドポイント

  • api.ドメイン/admin ~
  • admin.ドメイン ~

3. Laravel製のリポジトリDを新たに作り管理する

admin.ドメインにLaravelを置き、
リポジトリAと同じDBを共有する(.envのDB_HOST)

php [web.route]

1Route::middleware([])->group(function () {2 Route::get('/', function(){3 return blade file 4 });5});

メリット

  • 管理?保守?は辛いが副作用が少ない?
  • 完全にユーザーと分かれてるので分岐処理が減り可読性が高まる。
  • ユーザーが操作するようなリッチな機能や操作性も必要ないのでbladeで十分。
  • 一番やっすいEC2を用意して使うときだけ起動すれば、安いしセキュリティ○。

デメリット

  • サービスクラスやリポジトリクラスなどの再実装が必要。 ( 管理者が追加するデータはユーザーは参照しかしないので100%コピペ再実装というわけでもない ) →正直ここ次第な気がする
  • リポジトリが増える。
  • 若干、他2つよりかはセキュリティが劣る。 ( 攻撃対象が増える ) でもワンチャン高まる

追加されるエンドポイント

  • admin.ドメイン ~

おそらくこの3パターンになるかと思われますが、どれが一般的な実装なのでしょうか?
もしくは好みでも、理想論でも大丈夫です。

僕が取りこぼしたメリットとデメリットもあったら教えて欲しいです。

記載されていないパターン4、リポジトリBで管理する app.ドメイン/admin は多分sanctum周りでしんどいのとランディングページが分かれてるので管理者も分けるのが適切だと結論づけ排除しました。

作業者/管理者は僕一人ですが、サービスのスマホアプリ化などに伴って作業者/管理者の追加も発生する可能性があります。( 作業者...エンジニア、管理者...操作する人 )

またlaravelとnextjsは別にruby on railsとnuxtjsとかで置き換えてもらって構いません。

laravel9とnext14 app routerで実装してますが、バージョンとかもどうでも良いです。
実装経験年数は両者3-5年以上はあり実装自体の不安はありません。

コメントを投稿

0 コメント