Ibexa DXP のユーザー管理について

ユーザー管理¶
パスワード¶
### パスワードの変更と回復¶
ユーザーは、パスワードの変更を要求する場合もあれば、パスワードを忘れてリセットするように要求する場合もあります。

パスワードを変更するには、ユーザーにuser/password権限が必要です。

ユーザーが忘れたパスワードのリセットを要求すると、トークンが記載された電子メールがユーザーに送信されます。これにより、新しいパスワードを作成できます。

テンプレートを作成および構成する方法については、「パスワードを忘れた場合の追加」オプションを参照してください。

このメールのテンプレートは次の場所にありますtemplates/Security/mail/forgot_user_password.html.twigの中でezsystems/ezplatform-user。あなたはできるあなたのニーズに合わせてカスタマイズ。

パスワード回復トークンの有効性は、ezplatform.system.<siteaccess>.security.token_interval_specパラメーターを使用して設定できます。デフォルトでは、PT1H（1時間）に設定されています。

### パスワード規則¶
プロジェクトのパスワードポリシーをカスタマイズできます。各パスワード設定は、ユーザーフィールドタイプごとにカスタマイズできます。パスワード属性またはパスワード有効期限設定を変更し、パスワードを繰り返すためのルールを決定できます。

パスワード設定にアクセスするには：

バックオフィスの管理パネルで、[コンテンツタイプ]タブを開きます。
ではコンテンツタイプグループのテーブル、をクリックしてユーザー。
ユーザーコンテンツタイプを編集します。
[フィールド定義]リストで、ユーザーアカウント（ezuser）の設定を表示します。
ヒント

組み込みのユーザーコンテンツタイプ以外にも、ユーザーとして機能する他のコンテンツタイプが存在する可能性があります。詳細については、ユーザー識別子を参照してください。

### パスワード属性¶
でユーザーアカウント（ezuser）パスワードは少なくとも含まれている必要がある場合フィールド定義、あなたが決めることができます。

1つの大文字
1つの小文字
1つの番号
英数字以外の1文字
パスワードの最小長を設定することもできます。

パスワードの有効期限¶
でユーザーアカウント（ezuser）フィールド定義、定期的にユーザにパスワードの変更を強制するパスワードの有効期限ルールを設定することができます。

パスワードの有効期限設定

また、パスワードを変更する必要があることをユーザーに通知するタイミングを決定することもできます。通知は、ログイン後のバックオフィスとユーザーコンテンツアイテムのプレビューに表示されます。

### 繰り返しパスワード¶
パスワードを再利用できないというルールを設定できます。ユーザーアカウント（ezuser）フィールドタイプの設定でユーザーコンテンツタイプに設定します。これが設定されている場合、ユーザーは有効期限が切れたときに同じパスワードを入力できません。新しいものに変更する必要があります。

これは、新しいパスワードを現在のパスワードと照合するだけです。以前に使用したパスワードを再度使用できます。

このルールは、パスワードの有効期限が設定されている場合、デフォルトで有効です。

### ログイン方法¶
ユーザー名または電子メールの2つのログイン方法を使用できます。

これらの2つの方法のためのプロバイダがあるezpublish.security.user_provider.username とezpublish.security.user_provider.email、それぞれ。

次の場所で許可されるメソッドを構成できますpackages/security.yaml。

```yaml
security:
    providers:
        ezplatform:
            chain:
                providers: [ezplatform_username, ezplatform_email]

        ezplatform_username:
            id: ezpublish.security.user_provider.username

        ezplatform_email:
            id: ezpublish.security.user_provider.email

    firewalls:
        #...    
        ezpublish_front:
            # ...
            provider: ezplatform
```

ログイン方法として使用される電子メールアドレスが一意である必要があるかどうかをユーザーフィールドごとにカスタマイズできます。

既存のすべてのユーザーアカウントに一意の電子メールがあることを確認するには、ibexa:user:audit-databaseコマンドを実行します。メールが重複しているすべてのユーザーアカウントが一覧表示されます。

注意

電子メールでのログインはバージョンv3.0まで利用できなかったため、既存のデータベースでこのオプションを使用すると問題が発生する可能性があります。

これは、複数のアカウントが同じメールアドレスを使用している場合に発生する可能性があります。ユーザー名によるログインは引き続き利用できます。

問題を解決するには、ibexa:user:audit-database 重複する電子メールを持つアカウントを実行して手動で変更します。

### ログインルール¶
許可されるユーザー名のルールは、バックオフィスのユーザーフィールドごとに設定できます。

ルールは正規表現を使用して設定されます。

たとえば、ユーザー名に小文字のみを含めることができるようにするには、ユーザー名パターン[a-z]+$として設定します。

ユーザー名パターンの設定

既存のすべてのユーザーアカウントに現在のパターンに一致する名前が付いていることを確認するには、ibexa:user:audit-databaseコマンドを実行します。データベース内のすべてのユーザーアカウントをチェックし、パターンに適合しないユーザーアカウントを一覧表示します。

### 新規ユーザーの登録¶
/registerルートを使用して、ユーザーがアカウントを作成できるようにすることができます。このルートは登録フォームにつながり、入力すると、リポジトリに新しいユーザーコンテンツアイテムが作成されます。

### ユーザーグループ¶
デフォルトでは、この方法で生成された新しいユーザーはゲストアカウントグループに配置されます。構成の次のセクションで、別のデフォルトグループを選択できます。

```yaml
ezplatform:
    system:
        default:
            user_registration:
                group_id: <userGroupContentId>
```

### その他のユーザー管理テンプレート¶
次のフォームテンプレートを変更することもできます。

ユーザーパスワードの変更：

```yaml
ezpublish:
    system:
        <siteaccess>:
            user_change_password:
                templates:
                    form: <path_to_template>
```

パスワード回復フォーム：


ezsettings.<siteaccess>.user_forgot_password.templates.form
ezsettings.<siteaccess>.user_forgot_password_success.templates.form
ezsettings.<siteaccess>.user_forgot_password_login.templates.form
ezsettings.<siteaccess>.user_forgot_password.templates.mail
パスワードのリセット：


ezsettings.<siteaccess>.user_reset_password.templates.form
ezsettings.<siteaccess>.user_reset_password.templates.invalid_link
ezsettings.<siteaccess>.user_reset_password.templates.success
ユーザー設定：


ezsettings.<siteaccess>.user_settings.templates.list
ezsettings.<siteaccess>.user_settings.templates.update
複数のユーザープロバイダーによるユーザーの認証¶
symfonyは複数のユーザープロバイダーにネイティブサポートを 提供します。これにより、SSOや既存のサードパーティバンドル（FR3DLdapBundle、  HWIOauthBundle、  FOSUserBundle、  BeSimpleSsoAuthBundleなど）を含む、あらゆる種類のログインハンドラーを簡単に統合できます 。

ただし、 Ibexa DXPで外部ユーザープロバイダーを使用できるようにするに は、有効なプラットフォームユーザーをリポジトリに挿入する必要があります。これは主に、カーネルがコンテンツ関連のアクセス許可を管理できるようにするためのものです（ただし、これに限定されません）。

コンテキストに応じて、プラットフォームユーザーを作成するか、既存のユーザーを返すか、または常に汎用ユーザーを使用する必要があります。

外部 ユーザーが一致するたびに（つまり、LDAPからのユーザーのように、プラットフォームリポジトリからのユーザーではない場合）、IbexaDXPカーネルがMVCEvents::INTERACTIVE_LOGIN イベントを開始し ます。このイベントをリッスンするすべてのサービスeZ\Publish\Core\MVC\Symfony\Event\InteractiveLoginEvent は、元のセキュリティトークン（一致したユーザーを保持する）とリクエストを含むオブジェクトを受け取ります。

次に、リポジトリからプラットフォームユーザーを取得し、それをイベントオブジェクトに割り当てるのはリスナーの責任です。このユーザーはリポジトリに挿入され、残りのリクエストに使用されます。

Ibexa DXPユーザーが返されない場合は、匿名ユーザーが使用されます。

### ユーザー公開およびセキュリティトークン¶
ときに、外部 ユーザが一致する、異なるトークンは、セキュリティコンテキスト内に注入されます InteractiveLoginToken。このトークンUserWrapped は、最初に一致したユーザーとAPIユーザー （Ibexa DXPリポジトリからのもの）を含むインスタンスを保持し ます 。

APIユーザー は主にリポジトリに対する権限チェックに使用されるため、内部にとどまる ことに注意してください 。

### Userクラスのカスタマイズ¶
ezpublish.security.login_listener サービスを拡張することで使用されるユーザークラスをカスタマイズすることができます eZ\Publish\Core\MVC\Symfony\Security\EventListener\SecurityListener。デフォルトは 。です。

をgetUser() 実装している限り、オーバーライドして必要なUserクラスを返す ことができます eZ\Publish\Core\MVC\Symfony\Security\UserInterface。

次に、メモリ内ユーザープロバイダーの使用例を示します。

```yaml
# config/packages/security.yaml
security:
    providers:
        # Chaining in_memory and ezpublish user providers
        chain_provider:
            chain:
                providers: [in_memory, ezpublish]
        ezpublish:
            id: ezpublish.security.user_provider
        in_memory:
            memory:
                users:
                    # You will then be able to login with username "user" and password "userpass"
                    user:  { password: userpass, roles: [ 'ROLE_USER' ] }
    # The "in memory" provider requires an encoder for Symfony\Component\Security\Core\User\User
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
```

### リスナーの実装¶
でconfig/services.yamlファイル：

```yaml
services:
    App\EventListener\InteractiveLoginListener:
        arguments: ['@ezpublish.api.service.user']
        tags:
            - { name: kernel.event_subscriber } 
```

MVCEvents::INTERACTIVE_LOGINイベント（Ibexa DXPに固有）とSecurityEvents::INTERACTIVE_LOGINイベント（Symfonyセキュリティコンポーネントによって起動される）を混在させないでください。

```php
<?php

namespace App\EventListener;

use eZ\Publish\API\Repository\UserService;
use eZ\Publish\Core\MVC\Symfony\Event\InteractiveLoginEvent;
use eZ\Publish\Core\MVC\Symfony\MVCEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class InteractiveLoginListener implements EventSubscriberInterface
{
    /**
     * @var \eZ\Publish\API\Repository\UserService
     */
    private $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    public static function getSubscribedEvents()
    {
        return [
            MVCEvents::INTERACTIVE_LOGIN => 'onInteractiveLogin'
        ];
    }

    public function onInteractiveLogin(InteractiveLoginEvent $event)
    {
        // This loads a generic User and assigns it back to the event.
        // You may want to create Users here, or even load predefined Users depending on your own rules.
        $event->setApiUser($this->userService->loadUserByLogin( 'lolautruche' ));
    }
} 
```