Name:
interface
Value:
Amplify has re-imagined the way frontend developers build fullstack applications. Develop and deploy without the hassle.
Gen1 DocsLegacy

Page updated Jun 20, 2024

ユーザー単位/オーナー単位のデータアクセス

owner認可戦略により、レコードへのアクセスが特定のユーザーに制限されます。owner認可が設定されている場合、レコードのownerのみが指定された操作を実行できます。

ユーザー単位/オーナー単位の認可ルールを追加

owner認可戦略を使用して、レコードのアクセスを特定のユーザーに制限できます。owner認可が設定されている場合、レコードのownerのみが指定された操作を実行できます。

amplify/data/resource.ts
// Todoの「オーナー」は、自分のTodoの作成、読み取り、更新、削除が許可されます
const schema = a.schema({
Todo: a
.model({
content: a.string(),
})
.authorization(allow => [allow.owner()]),
});
amplify/data/resource.ts
// Todoレコードの「オーナー」は、作成、読み取り、更新のみが許可されます。
// Todoレコードの「オーナー」は削除が拒否されます。
const schema = a.schema({
Todo: a
.model({
content: a.string(),
})
.authorization(allow => [allow.owner().to(['create', 'read', 'update'])]),
});

アプリケーション内では、userPools認証モードを使用してモデルに対してCRUD操作を実行できます。

try {
final todo = Todo(content: 'My new todo');
final request = ModelMutations.create(
todo,
authorizationMode: APIAuthorizationType.userPools,
);
final createdTodo = await Amplify.API.mutations(request: request).response;
if (createdTodo == null) {
safePrint('errors: ${response.errors}');
return;
}
safePrint('Mutation result: ${createdTodo.name}');
} on APIException catch (e) {
safePrint('Failed to create todo', e);
}

バックグラウンドで、Amplifyは自動的に各レコードにowner: a.string()フィールドを追加し、レコード作成時にレコードオーナーのアイデンティティ情報が含まれます。

デフォルトでは、Cognitoユーザープールのユーザー情報がownerフィールドに入力されます。保存される値は<sub>::<username>の形式でsubusernameを含みます。APIは<sub>::<username>の完全な値またはsub/usernameを個別に認可し、usernameを返します。または、OpenID Connectを認可プロバイダーとして設定することもできます。

デフォルトでは、オーナーは既存レコードのオーナーを別のユーザーに変更できます。

オーナーがレコードを別のユーザーに変更できないようにするには、オーナーフィールド(デフォルト:owner: String)をフィールドレベルの認可ルールで保護してください。たとえば、ソーシャルメディアアプリでは、Aliceが自分のPostをBobに変更できないようにしたいでしょう。

const schema = a.schema({
Todo: a
.model({
content: a.string(),
owner: a.string().authorization(allow => [allow.owner().to(['read', 'delete'])]),
})
.authorization(allow => [allow.owner()]),
});

オーナーフィールドをカスタマイズ

認可ルール内に独自のownerFieldを指定することで、ownerフィールドを独自の好みのフィールドでオーバーライドできます。

const schema = a.schema({
Todo: a
.model({
content: a.string(),
author: a.string(), // record owner information now stored in "author" field
})
.authorization(allow => [allow.ownerDefinedIn('author')]),
});