亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

symfony 4:身份驗證成功后,它會重定向到管理區域并使用匿名令牌填充 TokenStorage

symfony 4:身份驗證成功后,它會重定向到管理區域并使用匿名令牌填充 TokenStorage

PHP
慕俠2389804 2023-10-15 16:24:48
我有一個舊的 Symfony 3.1 站點,我將其升級到 Symfony 3.4.x,然后升級到 Symfony 4.4.11,但我沒有將其升級到 symfony flex。我修復了很多問題,公共網站似乎可以正常工作。我必須重建身份驗證,因為舊的身份驗證與 sf4 不兼容。我按照這個 https://symfony.com/doc/4.4/security/form_login_setup.html這是: https: //symfonycasts.com/screencast/symfony-security/make-user我最終遇到的情況是,在成功進行身份驗證后,當它重定向到管理區域時,它總是再次檢查 LoginFormAuthenticator,這顯然不支持管理區域,并且它會重定向回匿名用戶的登錄頁面。關于這個問題有很多討論,并嘗試了我發現的所有內容,但沒有找到解決方案。即使調試它也不行。會話保存在定義的路徑中。它的id與瀏覽器中的PHPSESSID相同。站點運行 HTTP 協議。安全.ymlsecurity:    encoders:        AppBundle\Entity\User:            algorithm: bcrypt            cost: 12    providers:        user_provider:            entity:                class: AppBundle:User                property: email    firewalls:        dev:            pattern: ^/(_(profiler|wdt|error)|css|images|js)/            security: false        main:            stateless: true            pattern: ^/            anonymous: true            logout_on_user_change: true            guard:                authenticators:                    - AppBundle\Security\LoginFormAuthenticator            form_login:                provider: user_provider                username_parameter: email                csrf_token_generator: security.csrf.token_manager                login_path: app_login            logout:                path: app_logout    access_control:        - { path: ^/admin, roles: ROLE_ADMIN }        - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }路由:app_login:    path:     /login    defaults: { _controller: AppBundle\Controller\BackendController:loginAction }app_logout:    path:     /logout    defaults: { _controller: AppBundle\Controller\BackendController:logoutAction }app_admin:    path:         /admin/{page}/{entry}    defaults:     { _controller: AppBundle\Controller\BackendController:showAction, entry: null }
查看完整描述

2 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

您必須更改您的防護身份驗證器 AppBundle\Security\LoginFormAuthenticator

這向警衛解釋您只需要檢查登錄頁面上的憑據

public function supports(Request $request){
    return 'login_route' === $request->attributes->get('_route') && $request->isMethod('POST');
}

https://symfony.com/doc/4.4/security/guard_authentication.html#avoid-authenticating-the-browser-on-every-request


查看完整回答
反對 回復 2023-10-15
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

我的同事找出了問題所在。實際上上面的代碼有很多問題。

  1. 使用 GuardAuthenticator 接口已從 sf4 中刪除: https://github.com/symfony/symfony/blob/4.4/UPGRADE-4.0.md#security

  2. logout_on_user_change 不是必需的

  3. 不需要 LoginFormAuthenticator。

  4. stateless: true 是防火墻中的錯誤設置,但當我刪除它時,它會拋出先前的錯誤:“無法刷新令牌,因為用戶已更改。嘗試刷新令牌后,令牌已取消身份驗證?!?nbsp;這件事發生是因為

  5. 在 isEqualTo 中我檢查了$this->salt !== $user->getSalt()但它沒有序列化

所以工作解決方案看起來像這樣

  • 路由是一樣的

  • 后端控制器是相同的

  • LoginFormAuthentication.php 已刪除

安全.yml

security:

    encoders:

        AppBundle\Entity\User:

            algorithm: bcrypt

            cost: 12


    providers:

        user_provider:

            entity:

                class: AppBundle:User

                property: email


    firewalls:

        dev:

            pattern: ^/(_(profiler|wdt|error)|css|images|js)/

            security: false


        main:

            anonymous: ~

            provider: user_provider


            form_login:

                login_path: app_login

                check_path: app_login

                default_target_path: app_admin


            logout:

                path: app_logout


    access_control:

        - { path: ^/admin, roles: ROLE_ADMIN }

        - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }

用戶.php


class User implements UserInterface, \Serializable, EquatableInterface

{


    // ..


    public function serialize()

    {

        return serialize(array(

            $this->id,

            $this->email,

            $this->password,

            $this->salt,

        ));

    }


    public function unserialize($serialized)

    {

        list (

            $this->id,

            $this->email,

            $this->password,

            $this->salt

            ) = unserialize($serialized, array('allowed_classes' => false));

    }


    public function isEqualTo(UserInterface $user)

    {

        if (!$user instanceof User) {

            return false;

        }


        if ($user->getId() == $this->getId()) {

            return true;

        }


        if ($this->password !== $user->getPassword()) {

            return false;

        }


        if ($this->salt !== $user->getSalt()) {

            return false;

        }


        if ($this->email !== $user->getUsername()) {

            return false;

        }


        return true;

    }

}


查看完整回答
反對 回復 2023-10-15
  • 2 回答
  • 0 關注
  • 152 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號