※この記事では暗号化と言えばハッシュ化も含むこととします。

権限管理が複雑なモール型・テナント型ECサイト等ではサイト内での権限や所属によってパスワードのハッシュ化・暗号化要件が異なるということがあります。

だけどもModelクラス(エンティティ)は同一にしたいという場合、権限によってパスワードのハッシュ化・暗号化方式を変えるという細かい設定が必要になります。

デフォルトの暗号化形式

EC-CUBEではどのファイルで暗号化方式が決定されているかというとSymfonyの作法に基づき、

app/config/eccube/packages/security.yaml です。

security:
    encoders:
        # Our user class and the algorithm we'll use to encode passwords
        # https://symfony.com/doc/current/security.html#c-encoding-the-user-s-password
        Eccube\Entity\Member:
          id: Eccube\Security\Core\Encoder\PasswordEncoder
        Eccube\Entity\Customer:
          id: Eccube\Security\Core\Encoder\PasswordEncoder

PasswordEncoderのコードを辿っていくとapp/config/eccube/packages/eccube.yamlで指定されているeccube_password_hash_algosのパラメータが使用されていることが分かります。つまりSHA256です。

eccube_password_hash_algos: SHA256

また、CustomerとMemberの暗号化形式を変更するだけであればencodersでエンコーダーを指定すれば良いということが分かります。

Memberを権限(ロール)によって暗号化形式変更

ここで管理ユーザーMemberの権限ID2だけを暗号化形式を変更したいとします。security.yamlではエンティティごとのエンコーダー指定になるため、要件に沿った設定を行うことができません。

同一エンティティ内で切り分けるには、MemberクラスをEncoderAwareInterfaceに準拠させます。

class Member extends \Eccube\Entity\AbstractEntity implements UserInterface,\Symfony\Component\Security\Core\Encoder\EncoderAwareInterface

下記のメソッドを追加します。

public function getEncoderName()
        {
            if ($this->getAuthority()->getId() === 2) {
                return "エンコーダーのサービス名";
            }

            return null;
        }

エンコーダーを変更したい権限のみサービス名をreturnし、デフォルトのままで良い場合はreturn nullとします。これで管理ユーザーMemberの権限ID2だけの暗号化方式を変更することができました。

このテクニックはモール型など権限を多く必要とする場合に役に立つことがありますのでぜひ大規模ECサイトで活用してみてください。