繁体   English   中英

Symfony 4在login_check之后以匿名身份登录

[英]Symfony 4 logs in as anonymous after login_check

在Symfony 4中,当我通过登录表单以用户身份登录时,它将数据发布到/ login_check,它正确标识并认证了用户,然后在将用户重定向到目标路径时,将其重新认证为匿名用户。

我查看了xdebug并随后进行了所有身份验证过程,它实际上登录了用户,重定向了该用户,并以匿名用户身份重新进行身份验证。 我不知道是什么原因造成的。

使用“ 记住我”功能时,所有功能均按预期工作,因此仅在不使用时可以使用。

在此处输入图片说明

302重定向“ POST @login(2c1c05)”实际上已登录,如下所示

在此处输入图片说明

安全选项卡正确显示用户:

在此处输入图片说明

但是,重定向注销该用户,并以匿名用户身份重新认证:

在此处输入图片说明 在此处输入图片说明

我的安全配置如下所示:

security:
    encoders:
        App\Entity\Current\CurrentUser:
            algorithm: sha512
            iterations: 5000
            encode_as_base64: true
        App\Entity\Legacy\User:
            algorithm: sha512
            iterations: 0
            encode_as_base64: false
            id: app.security.legacy_digest
        Symfony\Component\Security\Core\User\User:
            algorithm: sha512

    providers:
        chain_provider:
            chain:
                providers: [in_memory_provider, legacy_entity_provider, current_entity_provider]
        in_memory_provider:
            memory:
                users:
                    bar:
                        password:           sX49rzTmjz3+u9XFIkpphfNxjKHMrPWP7Y6l7sKkadWIgOFuYo+Ixjj6iMCeWr0LlUh9EXfi5nw5lgz4W5LDKA==
                        roles:              [ROLE_USER, ROLE_ADMIN]
        legacy_entity_provider:
            entity:
                class:              App\Entity\Legacy\User
                manager_name:       legacy
                property: username

        current_entity_provider:
            entity:
                class:              App\Entity\Current\CurrentUser
                property:           username
                manager_name:       current


    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            provider: chain_provider
            anonymous: true
            form_login:
                login_path: /login
                check_path: /login
                username_parameter: _username
                password_parameter: _password
            logout:
                path: logout
                target: /

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

    role_hierarchy:
        ROLE_ADMIN:      [ROLE_USER]

我的登录表格:

<form id="login-form" action="/login" method="post">
                <fieldset>
                    <label for="login">{% trans %}label.login{% endtrans %}</label>
                    <input class="form-control" type="text" id="username" name="_username" value="{{ last_username }}"/>
                    <label for="password">{% trans %}label.password{% endtrans %}</label>
                    <input type="password" class="form-control mb-2" id="password" name="_password"/>
                    <input type="hidden" name="_target_path" value="{{ path(('myaccount_fr_fr' )) }}"/>
                    <button id="login-button" type="submit" class="btn mb-2  btn-secondary btn-block btn-submit_FX text-uppercase">
                        {% trans %}button.loginSubmit{% endtrans %}
                    </button>
                </fieldset>
            </form>

登录路由路径:

login:
    path: /login
    controller: App\Controller\SecurityController::login

SecurityController:

class SecurityController extends Controller
{

    public function login(Request $request, AuthenticationUtils $authenticationUtils)
    {
        $error = $authenticationUtils->getLastAuthenticationError();
        $lastUsername = $authenticationUtils->getLastUsername();

        return $this->render('user/login.html.twig', array (
            'last_username' => $lastUsername,
            'error' => $error,
        ));
    }
}

当错误地为我们的应用程序配置一组功能时,有时会出现奇怪的行为,而不会出现我们需要解密的某种错误,而在我们的应用程序中只有某种附带影响或行为。 在这种情况下,登录时,它将自动注销用户,而不会出现任何其他错误。

使用AdvancedUserInterface时,用户实体需要实现4个附加功能

public function isAccountNonExpired();

public function isAccountNonLocked();

public function isCredentialsNonExpired();

public function isEnabled();

请注意,此用户实现从4.1开始不推荐使用,建议改为使用用户检查器

如果遵循文档,您会发现在第一个示例中您会发现以下内容:

在第一个示例中:

    /**
     * @ORM\Column(name="is_active", type="boolean")
     */
    private $isActive;

    public function __construct()
    {
        $this->isActive = true;
        // may not be needed, see section on salt below
        // $this->salt = md5(uniqid('', true));
    }

然后在“禁止不活动的用户(AdvancedUserInterface)”部分中降低

public function isEnabled()
    {
        return $this->isActive;
    }

好吧,这不起作用,就像您期望的那样。 在随后的请求中,当用户被ORM充水时,对象未完全构建,isActive返回null。 您需要从数据库本身获取isActive或从常量本身强制它:

private $isActive = true;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM