mcpField
C
configuring-tauri-permissions

configuring-tauri-permissions

github.com/dchukセキュリティ36345 回インストール40 週間前に更新
リポジトリ

configuring-tauri-permissions について

Tauri v2 で、フロントエンドからバックエンドのコマンドやシステムリソースへのアクセスを設定する開発者向けスキルです。権限、スコープ、ケイパビリティ、トラブルシューティングを扱います。

主な機能

  1. 01ケイパビリティによる権限の割り当て
  2. 02パスやリソースのアクセス範囲設定
  3. 03許可・拒否ルールの構成
  4. 04ウィンドウとプラットフォームの指定
  5. 05カスタム権限セットの定義

活用シーン

  1. 01ウィンドウに指定コマンドへのアクセスを許可する
  2. 02ファイルシステムへのアクセスを特定パスに制限する
  3. 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>:defaultfs: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-user
  • allow-save-user / deny-save-user
  • allow-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 を実行して権限を再生成します
権限のデバッグ
  1. 生成されたスキーマを確認します:src-tauri/gen/schemas/
  2. ケイパビリティファイルが正しく読み込まれていることを確認します
  3. ウィンドウ名がケイパビリティの対象と一致していることを確認します
  4. 拒否ルールによってアクセスがブロックされていないことを確認します

ベストプラクティス

  1. 最小権限の原則:実際に必要な権限のみを付与します
  2. 具体的なスコープを使用する:$HOME/** よりも $APPDATA/* を優先します
  3. 機密性の高いパスを拒否する:.ssh、認証情報などへのアクセスは必ず拒否します
  4. ケイパビリティを分ける:ウィンドウの種類ごとに異なるケイパビリティを使用します
  5. カスタム権限を文書化する:明確な説明を記載します
  6. プラグインのデフォルトを確認する:デフォルトで付与される権限を把握します
  7. プラットフォーム固有の設定:OS 固有のニーズにはプラットフォームターゲティングを使用します

コメント