テナントの情報をもとにした認可の実装
認可の実装
料金プランの計測単位に基づいたコメント上限の実装
さきほどのサンプルアプリケーションにさらに手を加えていき、認可の一歩目を実装してみます。
ここまでのSaaSus Platformの設定で、どのユーザがログインしていて、そのユーザはどのテナントに属していてどんな役割で、そのテナントがどの料金プランを選択していて、どんなメニューが使えるのか?というのがアプリケーションから取得できる状態になっています。その情報を使って、アプリケーションに制限をかけていきます。
ここでは、料金プランの中の計測単位の一部である「コメント数」に注目してみましょう。
さきほど、料金プランごとにコメント数の上限値が異なっている設定を行いました。
- Free プランでは、コメント数上限 10
- Basic プランでは、コメント数上限 100
- Advanced プラン以上では、上限なし
という設定を行っています。
では、この料金プランに紐付いた上限数をテナントごとに取得して、制限をかけてみましょう。
では、先ほど書き換えた、 api/app/Http/Controllers/MessageController.php のpostメソッドを以下のように書き換えてみましょう。
- PHP
public function post(Request $request)
{
$validated = $request->validate([
'message' => 'required|max:255'
]);
$tenant_id = $request->userinfo['tenants'][0]['id'];
$plan_id = $request->userinfo['tenants'][0]['plan_id'];
// SaaSus SDKを使ってSaaSus APIを叩いて、各種情報を取得し、判断に使う
$client = new \AntiPatternInc\Saasus\Api\Client();
$pricingApi = $client->getPricingClient();
$res = $pricingApi->getPricingPlan($plan_id, $pricingApi::FETCH_RESPONSE);
$plan = json_decode($res->getBody(), true);
// メータリングのメータ、comment_count(コメント数)を使う
$meteringUnitName = "comment_count";
$res = $pricingApi->getMeteringUnitDateCountByTenantIdAndUnitNameToday($tenant_id, $meteringUnitName, $pricingApi::FETCH_RESPONSE);
// 今回は、1日ごとの上限コメント数として扱う
$count = json_decode($res->getBody(), true);
// メータリングの上限コメント数を取得
$upper = \AntiPatternInc\Saasus\Api\Lib::findUpperCountByMeteringUnitName($plan, $meteringUnitName);
// 現在契約中の料金プランの上限コメント数を超えていたら、投稿できなくする
if ($count['count'] < $upper || $upper === 0) {
$message = Message::create([
'tenant_id' => $tenant_id,
'user_id' => $request->userinfo['tenants'][0]['user_attribute']['username'],
'message' => $request->message,
]);
// メータリングAPIで、コメント数に1を足す
$param = new \AntiPatternInc\Saasus\Sdk\Pricing\Model\UpdateMeteringUnitTimestampCountNowParam();
$param->setMethod('add');
$param->setCount(1);
$res = $pricingApi->updateMeteringUnitTimestampCountNow($request->userinfo['tenants'][0]['id'], $meteringUnitName, $param, $pricingApi::FETCH_RESPONSE);
}
$request->session()->regenerateToken();
return redirect()->route('board');
}
先ほどのコードに加えて、コメント数の対象メーター “comment_count” をベースにしてコメント数の上限を確認し ています。
先ほど、計測単位は以下の画面のようにどの料金プランの計測単位でも “comment_count” をベースに設定していると思います。
そこでコード上では、
テナントに紐付いている料金プランを取得し、
対象メーター “comment_count” の現在の値を取得し、
料金プランに紐付いている上限値 “comment_count” の 上限値を確認しています
そして、もし現在の値が上限値を超えていなければ、
コメント書き込み処理を通常通り行い、
対象メーター “comment_count” の現在の値に1を足して更新します。
このようにすることで、料金プランごとの上限値を超えた場合には書き込みを行わせない、ということを実現できます。
今回は処理をシンプルにするために、書き込みが行えないということにとどめていますが、実際はエラーメッセージを出したり、アップセルを促すメッセージを出すことになると思います。
しかし、機能によっては上限値で完全に止めてしまうとSaaSの価値が損なわれる場合があります。
たとえば、今回のようにコメントに上限をもうけて、そこで完全に書き込みができなくなってしまうと、これはチャットとして成り立たなくなってしまいます。
そうした場合、このメーターがリセットされるまで、このSaaSは使われなくなってしまう可能性があります。
その後、ずっと使われなくなってしまう可能性 ももちろんあります。
そのため、完全に止めるのではなく、書き込みはできるが警告を出したり、保存期間を調整するなどこのSaaS自体の価値が失われないようにすることが重要です。
今回はチュートリアルですので、無情にも完全に書き込みができない状態にしました。では、ちゃんと上限で書き込みができなくなっているか試してみましょう!
まず、最初にアプリケーションを初期化したときのように、 init.sh を実行してアプリケーションをまっさらな状態に戻しましょう。
そして、テナント1の方にはFreeプランを設定し、user1-1@example.com でログインして、10件以上の書き込みを行ってみましょう。
フリープラン設定後の書き込みが、10件までしかできないことが確認できたと思います。
※ 今回はメーター設定後の書き込みのみをカウントする実装としています。
設定前の書き込みも考慮したい場合は、メーターの値を直接更新する方法もあります。
では、次にテナント2のユーザー user2-1@example.com でログインして、10件以上の書き込みを行ってみましょう。
こちらは上限が100件になっているので、10件以上の書き込みができたはずです。
さらに、テナント1の方がプランのアップグレードをした想定で、FreeプランからBasicプランに設定を変更して、再度 user1-1@example.com でログインして、10件以上の書き込みを行ってみましょう。
(設定変更後反映には5分ほど時間がかかります。)
今度は書き込みができるようになっているかと思います。
このような形で、料金プランに応じたメータリングや制限ができるようになりました!
制限はSaaSusと連携後から1件とカウントします。
APIとしてカウントの制限値を変更する機能など提供しております。
ここまでは、Bladeベースでのアプリケーションへの実装でしたが、最後に Next.js(APIベースでのSPA)への実装の場合はどのようにすればよいか?確認しておきましょう。