0

私は Symfony 5.2 で顧客のために新しいログイン リンク メソッド [1] を使用しています。この認証方法のみを使用する必要があります。しかし、管理者ユーザーにはログインフォーム認証 [2] も使用しています。

認証されていない顧客が制限されたパス (私の場合は /app) にアクセスすると、ログイン リンク フォームではなくフォーム ログインにリダイレクトされます。これは、セッションが期限切れになった場合や、制限された領域内のブックマークされたリンクに (認証されずに) アクセスした場合にも当てはまります。

/app resp のデフォルトのオーセンティケータを設定するにはどうすればよいですか。/管理者? 私はこのようなものが欲しいです:

  • カスタマーエリア /app -> /login (ログインリンク認証)
  • 管理エリア /admin -> /login-password (ログインフォーム認証)

私の security.yaml は次のようになります。

security:
    encoders:
        App\Entity\User:
            algorithm: auto

    enable_authenticator_manager: true
    providers:
        app_user_provider:
            entity:
                class: App\Entity\User
                property: email
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false    
        main:
            lazy: true
            provider: app_user_provider
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator
            login_link:
                check_route: login_check
                signature_properties: ['id']
                max_uses: 1
            logout:
                path: app_logout

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }
        - { path: ^/app, roles: ROLE_USER }
        - { path: ^/, roles: PUBLIC_ACCESS }

[1] ログインリンク方法: https://symfony.com/doc/current/security/login_link.html
[2] LoginFormAuthenticator: https://symfony.com/doc/current/security/form_login_setup.html

4

1 に答える 1

0

わかりました、私は自分で解決策を見つけました。より良い解決策があれば教えてください!

LoginFormAuthenticator クラスの start() メソッドを上書きします。AbstractFormLoginAuthenticator クラスの定義のために getLoginUrl() を上書きできないため、$request obj をプライベート クラス prop に格納します。次に、getLoginUrl() メソッドにロジックを追加して、ユーザーがアクセスしたい領域 (/admin または /app) を確認し、それに応じてリダイレクトします。それでおしまい。魅力のように機能します。;-)

// App\Security\LoginFormAuthenticator

    public const LOGIN_ROUTE                = 'admin_login';
    public const LOGIN_ROUTE_PASSWORDLESS   = 'app_login';

    ...

    private $request;

    ...

    /**
     * Override to control what happens when the user hits a secure page
     * but isn't logged in yet.
     *
     * @return RedirectResponse
     */
    public function start(Request $request, AuthenticationException $authException = null)
    {
        $this->request = $request;
        $url = $this->getLoginUrl();

        return new RedirectResponse($url);
    }

    ...

    protected function getLoginUrl()
    {
        // Check if user would like to access /app
        $path = $this->request->getPathInfo();
        
        if ('/app' === substr($path, 0, 4)) {
            return $this->urlGenerator->generate(self::LOGIN_ROUTE_PASSWORDLESS);
        }

        return $this->urlGenerator->generate(self::LOGIN_ROUTE);
    }
于 2021-04-21T21:57:31.337 に答える