configuring-tauri-permissions について
Tauri v2 で、フロントエンドからバックエンドのコマンドやシステムリソースへのアクセスを設定する開発者向けスキルです。権限、スコープ、ケイパビリティ、トラブルシューティングを扱います。
主な機能
- 01ケイパビリティによる権限の割り当て
- 02パスやリソースのアクセス範囲設定
- 03許可・拒否ルールの構成
- 04ウィンドウとプラットフォームの指定
- 05カスタム権限セットの定義
活用シーン
- 01ウィンドウに指定コマンドへのアクセスを許可する
- 02ファイルシステムへのアクセスを特定パスに制限する
- 03アクセス拒否や権限不足を調査する
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dchuk/ claude-code-tauri-skills --skill configuring-tauri-permissionsインストール後、Claude Code で/configuring-tauri-permissionsを入力して読み込まれたか確認します。
詳細
Tauri の権限設定
このスキルでは、フロントエンドからバックエンドのコマンドやシステムリソースへのアクセスを制御する Tauri v2 の権限システムについて説明します。
権限システムの概要
権限とは、特定のコマンドへのアクセスを許可または拒否する明示的な特権です。フロントエンドコードとシステムリソースの間のセキュリティ境界を形成します。
主な構成要素
| 構成要素 | 目的 |
|---|---|
| 権限 | 特定のコマンドへのアクセスを定義します |
| スコープ | コマンドを特定のパス/リソースに制限します |
| ケイパビリティ | 権限をウィンドウ/WebView に関連付けます |
| 識別子 | 権限を参照する一意の名前です |
セキュリティモデル
- フロントエンドコードは、明示的な権限がなければコマンドにアクセスできません
- 拒否ルールは常に許可ルールより優先されます
- 権限を有効にするには、ケイパビリティに関連付ける必要があります
- ウィンドウ/WebView ごとに異なる権限を設定できます
権限識別子
命名規則
形式:<plugin-name>:<permission-type>
| パターン | 例 | 説明 |
|---|---|---|
<name>:default | fs:default | デフォルトの権限セット |
<name>:allow-<command> | fs:allow-read-file | 特定のコマンドを許可します |
<name>:deny-<command> | fs:deny-write-file | 特定のコマンドを拒否します |
<name>:allow-<scope> | fs:allow-app-read | 定義済みのスコープで許可します |
識別子のルール
- 使用できるのは小文字の ASCII 文字のみです:
[a-z] - 最大長:116 文字
- プラグインのプレフィックス(
tauri-plugin-)はコンパイル時に自動的に追加されます
ディレクトリ構成
アプリケーションの構成
src-tauri/
├── capabilities/
│ ├── default.json # Main capability file
│ └── admin.toml # Additional capabilities
├── permissions/
│ └── custom-permission.toml # Custom app permissions
└── tauri.conf.json
プラグインの構成
tauri-plugin-example/
├── permissions/
│ ├── default.toml # Default permission set
│ ├── autogenerated/ # Auto-generated from commands
│ │ └── commands/
│ └── custom-scope.toml # Custom scopes
└── src/
├── commands.rs
└── build.rs
ケイパビリティの設定
ケイパビリティは権限をウィンドウに関連付け、フロントエンドのコンテキストがアクセスできる対象を定義します。
JSON 形式(アプリに推奨)
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "main-capability",
"description": "Main window permissions",
"windows": ["main"],
"permissions": [
"core:default",
"fs:default",
"fs:allow-read-text-file",
{
"identifier": "fs:allow-write-text-file",
"allow": [{ "path": "$APPDATA/*" }]
}
]
}
TOML 形式
"$schema" = "../gen/schemas/desktop-schema.json"
identifier = "main-capability"
description = "Main window permissions"
windows = ["main"]
permissions = [
"core:default",
"fs:default",
"fs:allow-read-text-file"
]
[[permissions]]
identifier = "fs:allow-write-text-file"
allow = [{ path = "$APPDATA/*" }]
ウィンドウの対象指定
{
"identifier": "admin-capability",
"windows": ["admin", "settings"],
"permissions": ["fs:allow-write-all"]
}
すべてのウィンドウを対象にするには "*" を使用します。
{
"windows": ["*"],
"permissions": ["core:default"]
}
プラットフォーム固有のケイパビリティ
{
"identifier": "desktop-capability",
"platforms": ["linux", "macOS", "windows"],
"windows": ["main"],
"permissions": ["fs:allow-app-read-recursive"]
}
{
"identifier": "mobile-capability",
"platforms": ["iOS", "android"],
"windows": ["main"],
"permissions": ["fs:allow-app-read"]
}
許可リストと拒否リスト
基本的なスコープ設定
{
"identifier": "fs:allow-read-file",
"allow": [
{ "path": "$HOME/Documents/*" },
{ "path": "$APPDATA/**" }
],
"deny": [
{ "path": "$HOME/Documents/secrets/*" }
]
}
スコープ変数
| 変数 | 説明 |
|---|---|
$APP | アプリケーションのインストールディレクトリ |
$APPCONFIG | アプリケーションの設定ディレクトリ |
$APPDATA | アプリケーションのデータディレクトリ |
$APPLOCALDATA | アプリケーションのローカルデータディレクトリ |
$APPCACHE | アプリケーションのキャッシュディレクトリ |
$APPLOG | アプリケーションのログディレクトリ |
$HOME | ユーザーのホームディレクトリ |
$DESKTOP | デスクトップディレクトリ |
$DOCUMENT | ドキュメントディレクトリ |
$DOWNLOAD | ダウンロードディレクトリ |
$RESOURCE | アプリケーションのリソースディレクトリ |
$TEMP | 一時ディレクトリ |
グロブパターン
| パターン | 一致する対象 |
|---|---|
* | ディレクトリ内のすべてのファイル |
** | 再帰的な対象(すべてのサブディレクトリ) |
*.txt | .txt 拡張子のファイル |
拒否ルールの優先順位
拒否ルールは常に許可ルールより優先されます。
{
"permissions": [
{
"identifier": "fs:allow-read-file",
"allow": [{ "path": "$HOME/**" }],
"deny": [{ "path": "$HOME/.ssh/**" }]
}
]
}
プラグインの権限
プラグインのデフォルト権限を使用する
{
"permissions": [
"fs:default",
"shell:default",
"http:default",
"dialog:default"
]
}
一般的なプラグイン権限のパターン
ファイルシステムプラグイン
{
"permissions": [
"fs:default",
"fs:allow-read-text-file",
"fs:allow-write-text-file",
"fs:allow-app-read-recursive",
"fs:allow-app-write-recursive",
"fs:deny-default"
]
}
HTTP プラグイン
{
"permissions": [
"http:default",
{
"identifier": "http:default",
"allow": [{ "url": "https://api.example.com/*" }],
"deny": [{ "url": "https://api.example.com/admin/*" }]
}
]
}
シェルプラグイン
{
"permissions": [
"shell:allow-open",
{
"identifier": "shell:allow-execute",
"allow": [
{ "name": "git", "cmd": "git", "args": true }
]
}
]
}
ディレクトリ固有のファイルシステム権限
| 権限 | アクセス |
|---|---|
fs:allow-appdata-read | $APPDATA の読み取り(再帰なし) |
fs:allow-appdata-read-recursive | $APPDATA の読み取り(再帰あり) |
fs:allow-appdata-write | $APPDATA への書き込み(再帰なし) |
fs:allow-appdata-write-recursive | $APPDATA への書き込み(再帰あり) |
fs:allow-home-read-recursive | $HOME の読み取り(再帰あり) |
fs:allow-temp-write | 一時ディレクトリへの書き込み |
カスタム権限の定義
TOML 権限ファイル
src-tauri/permissions/my-permission.toml を作成します。
[[permission]]
identifier = "my-app:config-access"
description = "Access to app configuration files"
commands.allow = ["read_config", "write_config"]
[[scope.allow]]
path = "$APPCONFIG/*"
[[scope.deny]]
path = "$APPCONFIG/secrets.json"
権限セット
複数の権限をグループ化します。
[[set]]
identifier = "my-app:full-access"
description = "Full application access"
permissions = [
"my-app:config-access",
"fs:allow-app-read-recursive",
"fs:allow-app-write-recursive"
]
自動生成されるコマンド権限
プラグインの src/build.rs で設定します。
const COMMANDS: &[&str] = &["get_user", "save_user", "delete_user"];
fn main() {
tauri_plugin::Builder::new(COMMANDS)
.build();
}
次の権限が生成されます。
allow-get-user/deny-get-userallow-save-user/deny-save-userallow-delete-user/deny-delete-user
デフォルトの権限セット
permissions/default.toml を作成します。
[default]
description = "Default permissions for my-plugin"
permissions = [
"allow-get-user",
"allow-save-user"
]
リモートアクセスの設定
リモート URL が Tauri API にアクセスできるようにします(注意して使用してください)。
{
"identifier": "remote-capability",
"windows": ["main"],
"remote": {
"urls": ["https://*.myapp.com"]
},
"permissions": [
"core:default"
]
}
セキュリティに関する警告:Linux と Android では、iframe リクエストとウィンドウリクエストを区別できません。
tauri.conf.json での設定
識別子でケイパビリティを参照します。
{
"app": {
"security": {
"capabilities": ["main-capability", "admin-capability"]
}
}
}
または、ケイパビリティを直接インラインで記述します。
{
"app": {
"security": {
"capabilities": [
{
"identifier": "inline-capability",
"windows": ["*"],
"permissions": ["core:default"]
}
]
}
}
}
トラブルシューティング
よくあるエラー
「このコマンドは許可されていません」
- ケイパビリティにコマンドの権限があることを確認します
- スコープに対象のパスが含まれていることを確認します
- ケイパビリティの対象が正しいウィンドウであることを確認します
権限が見つかりません
- 識別子のスペルを確認します(小文字のみ)
- プラグインがインストールされていることを確認します
cargo buildを実行して権限を再生成します
権限のデバッグ
- 生成されたスキーマを確認します:
src-tauri/gen/schemas/ - ケイパビリティファイルが正しく読み込まれていることを確認します
- ウィンドウ名がケイパビリティの対象と一致していることを確認します
- 拒否ルールによってアクセスがブロックされていないことを確認します
ベストプラクティス
- 最小権限の原則:実際に必要な権限のみを付与します
- 具体的なスコープを使用する:
$HOME/**よりも$APPDATA/*を優先します - 機密性の高いパスを拒否する:
.ssh、認証情報などへのアクセスは必ず拒否します - ケイパビリティを分ける:ウィンドウの種類ごとに異なるケイパビリティを使用します
- カスタム権限を文書化する:明確な説明を記載します
- プラグインのデフォルトを確認する:デフォルトで付与される権限を把握します
- プラットフォーム固有の設定:OS 固有のニーズにはプラットフォームターゲティングを使用します