# Redis認可

拡張認可はRedisとの連携による認可検証をサポートしています。

::: tip 注意

Redis認可はEMQX Serverlessのデプロイメントではサポートされていません。

:::

## データ構造とクエリコマンド

Redisオーソライザーは、[Redisハッシュ](https://redis.io/docs/manual/data-types/#hashes)を使用して認可データを格納することをサポートしています。ユーザーはクエリコマンドのテンプレートを提供する必要があり、クエリ結果には以下のフィールドが含まれている必要があります。

- `topic`：現在のルールが適用されるトピックを指定します。トピックフィルターやトピックプレースホルダーを使用可能です。
- `action`：現在のルールが適用される操作を指定します。値は `publish`、`subscribe`、`all` のいずれかです。
- `qos`：（オプション）ルールが適用されるメッセージのQoSを指定します。値は `0`、`1`、`2` のいずれか、または複数のQoSをNumber配列で指定可能です。デフォルトはすべてのQoSレベルです。
- `retain`：（オプション）現在のルールがリテインドメッセージのパブリッシュをサポートするかどうかを指定します。値は `true`、`false` で、デフォルトはリテインドメッセージを許可します。

ユーザー `emqx_u` に対し、トピック `t/1` のサブスクライブを許可する権限データの追加例：

```
HSET mqtt_acl:emqx_u t/1 subscribe
```

Redisの構造上の制限により、`qos` や `retain` フィールドを使用する場合は、`topic` 以外の情報をJSON文字列として格納する必要があります。例えば：

- ユーザー `emqx_u` に対し、トピック `t/2` のQoS1およびQoS2でのサブスクライブを許可する権限データの追加例：

```json
HSET mqtt_acl:emqx_u t/2 '{ "action": "subscribe", "qos": [1, 2] }'
```

- ユーザー `emqx_u` に対し、トピック `t/3` へのリテインドメッセージのパブリッシュを拒否する権限データの追加例：

```json
HSET mqtt_acl:emqx_u t/3 '{ "action": "publish", "retain": false }'
```

対応する設定項目は以下の通りです。

```bash
cmd = "HGETALL mqtt_acl:${username}"
```

## Redis認可の設定

デプロイメントにて、**アクセス制御** -> **認可** -> **拡張認可** をクリックし、**Redis認可** を選択して **設定** をクリックします。

- **Redisモード**：Redisデータベースのデプロイモードを選択します。選択肢は `Single`、`Sentinel`、`Cluster` です。
- **サーバー**：Redisサーバーのアドレス（host:port）を入力します。デプロイモードがSentinelまたはClusterの場合は、関連するすべてのRedisサーバーのアドレスをカンマ区切りで、host1:port1,host2:port2,... の形式で指定する必要があります。
- **Sentinel名**：デプロイモードが `Sentinel` の場合のみ必要です。Redis Sentinel構成で必要なマスターサーバー名を指定します。
- **データベース**：Redisデータベースのインデックスを整数で指定します。
- **パスワード**（オプション）：認証パスワードを入力します。
- **TLS有効化**：TLSを有効にするかどうかを設定します。
- **コネクションプールサイズ**（オプション）：EMQXノードからRedisデータベースへの同時接続数を整数で指定します。デフォルト値は `8` です。
- **CMD**：Redisクエリコマンドを指定します。

::: tip

- 現在のデプロイメントが専用版の場合、VPCピアリング接続を作成する必要があり、サーバーアドレスは内部ネットワークアドレスを指定してください。
- 現在のデプロイメントがBYOC版の場合は、パブリッククラウドコンソールでVPCピアリング接続を作成する必要があります。詳細は[BYOCデプロイメントの作成 - VPCピアリング接続の設定](../create/byoc.md#vpc-peering-connection-configuration)をご参照ください。サーバーアドレスは内部ネットワークアドレスを指定してください。
- 「Init resource failure!」が発生した場合は、サーバーアドレスの正確性およびセキュリティグループの開放状況を確認してください。

:::
