# クイックスタート：ネームスペースの体験

このセクションでは、[MQTTXクライアント](https://mqttx.app)を使ってEMQXに接続し、ネームスペース機能のコア機能であるテナント識別、クライアントおよびトピックの分離、ACL分離を素早く体験する方法を案内します。

## ネームスペースソースの有効化（`tns`属性の生成）

ネームスペースソースを設定することで、EMQXはクライアント接続情報からネームスペースを識別し、クライアント接続時に対応するネームスペースを自動的に作成できます。

### 設定ファイルによる有効化

`base.hocon`に以下の設定を追加し、ユーザー名からネームスペース識別子を抽出します。

```
mqtt.client_attrs_init = [
  { expression = "nth(1, tokens(username, '-'))", set_as_attr = tns }
]
```

**例**

クライアントがユーザー名 `tenantA-user1` で接続すると、EMQXは `tenantA` をネームスペース識別子として抽出します。

### ダッシュボードによる有効化

ダッシュボードでもネームスペースソースを設定できます。

1. **管理** -> **ネームスペース** -> **設定** に移動します。

2. **ネームスペースを解決するタイミング** はデフォルトの **認証前** のままにします。

3. **ネームスペースを取得する場所** に以下の式を入力します。

   ```
   nth(1, tokens(username, '-'))
   ```

4. **確認** をクリックして設定を保存します。

![namespace_source](./assets/namespace_source.png)

### ネームスペースの自動作成を確認

1. MQTTXを使ってテナント `tenantA` を模擬したMQTTクライアント接続を作成します。

   - **ユーザー名**：`tenantA-user1`
   - EMQXに接続します。

2. **ネームスペース** ページで **明示的に作成されたネームスペースのみ表示** を無効にします。

3. ネームスペース `tenantA` が自動的に作成されていることを確認します。

4. **操作** 列の **クライアント** をクリックし、このネームスペースに接続しているクライアントを表示します。

   ![namespace_client](./assets/namespace_client.png)

## ネームスペース分離の設定と確認

### クライアントIDおよびトピック分離の有効化

異なるネームスペース間でクライアントIDとトピックを分離するには、グローバルネームスペース設定で該当オプションを有効にする必要があります。

#### 設定ファイルによる有効化

`base.hocon`に以下の設定を追加します。

```hocon
mqtt.clientid_override = "concat([client_attrs.tns, '-', clientid])"
mqtt.namespace_as_mountpoint = true
```

この例では、EMQXは認証前にユーザー名からネームスペースを取得し、`client_attrs.tns`に格納します。

EMQX 6.3.0以降では、`mqtt.clientid_override`の式がエラーを返すか空文字列になる場合、接続を拒否します。すべてのクライアントがネームスペース式で期待される形式のユーザー名を提供していることを確認してください。その他のネームスペース解決モードについては、[クライアントID分離](./namespace-global-settings.md#client-id-isolation)を参照してください。

これらの設定により：

- クライアントIDにネームスペースのプレフィックスが自動的に付加され、ネームスペース間のクライアントID競合を防止します。
- ブローカー内部でトピックに `{namespace}/` のプレフィックスが自動的に付加され、ネームスペース単位のトピック分離を実現します。

#### ダッシュボードによる有効化

1. ダッシュボードで **管理** -> **ネームスペース** -> **設定** に移動します。

2. 以下のオプションを有効にします。

   - **クライアントID分離**（デフォルト値は `concat([client_attrs.tns, '-', clientid])`）
   - **ネームスペースをマウントポイントとして使用**

3. **確認** をクリックして設定を保存します。

### クライアントおよびトピック分離の確認

1. MQTTXを使って、2つのテナント `tenantA` と `tenantB` を模擬する2つのMQTTクライアント接続を作成します。

   **クライアントA（テナント：tenantA）**：

   | パラメータ | 値              |
   | ---------- | --------------- |
   | クライアントID | `client1`       |
   | ユーザー名  | `tenantA-user1` |
   | サブスクライブ | `test/topic`    |

   **クライアントB（テナント：tenantB）**：

   | パラメータ | 値              |
   | ---------- | --------------- |
   | クライアントID | `client1`       |
   | ユーザー名  | `tenantB-user2` |
   | パブリッシュ | `test/topic`    |

2. クライアントBでメッセージをパブリッシュします。MQTTXとEMQXダッシュボードで結果を確認します。

   - 両クライアントは同じクライアントID（`client1`）を使用していますが、プレフィックスルールにより `tenantA-client1` と `tenantB-client1` として接続され、競合を回避しています。
   - 両クライアントは同じトピック（`test/topic`）を使用していますが、ネームスペースで分離されているため、クライアントAはクライアントBがパブリッシュしたメッセージを**受信しません**。

3. **モニタリング** -> **クライアント** ページで以下を確認します。

   - クライアントAのサブスクライブトピックは `tenantA/test/topic` として表示されます。
   - クライアントBのパブリッシュトピックは `tenantB/test/topic` として表示されます。

![namespace_client_list](./assets/namespace_client_list.png)

![namespace_client_sub](./assets/namespace_client_sub.png)

## マウントポイントベースのACLチェックを有効化

デフォルトでは、後方互換性のために認可（ACL）チェックはトピックのプレフィックス（マウントポイント）を含みません。つまり、認可ルールは名前空間付きトピック（例：`tenantA/test/topic`）ではなく、元のトピック名（例：`test/topic`）に対してマッチングされます。

EMQX 6.1以降では、トピックのプレフィックスを含む認可チェックを有効化して、ネームスペース単位のACL分離を強制できます。

### 設定ファイルによる有効化

`base.hocon`に以下の設定を追加します。

```hocon
authorization.include_mountpoint = true
```

### ダッシュボードによる有効化

1. ダッシュボードで **管理** -> **ネームスペース** -> **設定** または **アクセス制御** -> **クライアント認可** -> **設定** に移動します。

2. **認可にマウントプレフィックスを含める** を有効にします。

3. 設定を保存します。

::: tip 補足

`authorization.include_mountpoint = true` を有効にすると、すべての認可ルールはトピックマッチングパターンにトピックプレフィックスを含める必要があります。

例えば、クライアントがトピックプレフィックス `tenantA/` を持つリスナー経由で接続し、`test/topic` をサブスクライブする場合、対応する認可ルールは `tenantA/test/topic` として設定しなければなりません。

:::
