メインコンテンツまでスキップ

分散ロックの保護

分散ロックは、データを順序よく処理するために共有リソースへのアクセス管理を行います。@secureDistributedLock デコレーターはロックを保護します。

Distributed locks は、共有リソースへのアクセスを一度に1つのクライアントにロックすることにより、レースコンディションを解決します。デフォルトでは、クライアントによる分散ロックへのアクセスは拒否されます。Squid backend の SquidService クラス内で、@secureDistributedLock() デコレーターを使用して、クライアントのロックアクセスを認可してください。

すべてのクライアントが任意の分散ロックをロックできるようにするには、以下の形式のセキュリティ関数を使用します:

Backend code
import { secureDistributedLock, SquidService } from '@squidcloud/backend';

@secureDistributedLock()
allowAllAccessToAcquiringLock(): boolean {
return true;
}

クライアントが分散ロックを利用しようとすると、その際に使用されるmutexの値が DistributedLockContext 内で Squid backend に渡されます。以下のセキュリティ関数は、allUsers mutex が認証された全ユーザーに利用可能で、admin mutex が認証トークンに admin 属性を持つユーザーのみに利用可能である場合の、mutex の値に基づいたロックの保護方法を示しています:

Backend code
import { secureDistributedLock, SquidService, DistributedLockContext } from '@squidcloud/backend';

@secureDistributedLock()
allowAllAccessToAcquiringLock(context: DistributedLockContext): boolean {
// If the mutex is "allUsers", return true if authenticated
if (context.mutex === "allUsers") {
return this.isAuthenticated();
}
// If the mutex is "admin", return true if the user is an admin
if (context.mutex === "admin") {
const userAuth = this.getUserAuth();
return !!userAuth.attributes['admin'];
}
return false; // all others are not allowed
}

分散ロックを使用したアプリの例を見るには、this blog postをチェックしてください。