Symfony 2.5.6 打破登录?

Posted

技术标签:

【中文标题】Symfony 2.5.6 打破登录?【英文标题】:Symfony 2.5.6 breaking login? 【发布时间】:2014-10-24 16:00:09 【问题描述】:

我遵循登录/安全约定,Symfony 2.3 到 2.55 一切正常,直到我更新到 2.5.6。现在正在显示登录网址:

属性“_username”和方法“getUsername()”、“username()”、“isUsername()”、“hasUsername()”、“__get()”都不存在并且在类中具有公共访问权限“Acme\DemoBundle\Entity\Login”。

有解决这个问题的办法吗?

namespace Acme\DemoBundle\Entity;

class Login 
    protected $_username;
    protected $_password;
    protected $_remember_me;

    public function get_Username() 
        return $this->_username;
    

    public function set_Username($username) 
        $this->_username = $username;
    

    public function get_Password() 
        return $this->_password;
    

    public function set_Password($password) 
        $this->_password = $password;
    

    public function get_RememberMe() 
        return $this->_remember_me;
    

    public function set_RememberMe($remember) 
        $this->_remember_me = $remember;
    

【问题讨论】:

去掉下划线。很惊讶它在 2.3 中工作。 Twig widget_attributes 块被覆盖,以便能够更改输入的名称。用户和登录不再使用 _username、_password 作为实体属性/输入 ID。但仍然使用 _username 等,作为交响乐登录所需的输入名称。现在 2.5.6 版本正在运行 ;) 【参考方案1】:

字段的名称是可配置的。您可以将_username_password 字段更改为您想要的任何内容,并将它们设置在security.yml 中。例如,当我使用自定义 LoginType(别名 login_form)时,我在 security.yml 中有这个:

security:
    firewalls:
         secured_area:
             username_parameter: login_form[username]
             password_parameter: login_form[password]

这允许我在登录模型中拥有$username$password 变量。

【讨论】:

【参考方案2】:

Symfony 标准登录需要您提交一个 _username 和 _password 命名的输入。 最初我的实体用户属性是用户名和密码。 不幸的是,我发现 twig 忽略了从表单类型生成器发送的 attrname='_username' 的输入。所以我采取了将实体属性重命名为下划线版本的快捷方式。 然后一切正常,直到我将 Symfony 更新到 2.5.6 版本。 然后正如 Cerad 建议的那样,我摆脱了实体下划线和表单 id... 但仍然需要使用下划线传递输入名称。所以我覆盖了这个假发块,只是将名称分配从第一行更改为最后一行:

% block widget_attributes -%
id=" id "
%- if read_only % readonly="readonly"% endif -%
%- if disabled % disabled="disabled"% endif -%
%- if required % required="required"% endif -%
%- for attrname, attrvalue in attr -%
    - " " -
    %- if attrname in ['placeholder', 'title'] -%
        - attrname =" attrvalue|trans(, translation_domain) "
    %- elseif attrvalue is sameas(true) -%
        - attrname =" attrname "
    %- elseif attrvalue is not sameas(false) -%
        - attrname =" attrvalue "
    %- endif -%
%- endfor -%
name=full_name
%- endblock widget_attributes %

【讨论】:

很高兴你能成功。您还可以将参数名称从 _username 更改为与默认表单内容更好匹配的名称,从而避免与 twig 混淆。 form_login: username_parameter: cerad_tourn_account_user_login[用户名] symfony.com/doc/current/reference/configuration/… 好主意。无论如何,我不明白为什么默认用户名不起作用,除非我覆盖 Twig,因此我认为我的解决方案不是一个坏的(尽管它已被投票否决),因为它甚至增加了覆盖默认名称属性的灵活性. 投票率低总是很烦人。通常这意味着投反对票的人不理解问题或答案,所以不要个人认为。 :) 谢谢,我只是害怕错过一些重要的点。

以上是关于Symfony 2.5.6 打破登录?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Symfony 路由从 .htaccess 重写 URL

Symfony 5:/lucky/number 应用程序的 404 页面

使用 localhost 从主机访问 Vagrant 机器上的 symfony Web 服务器

Symfony 5 - 使用 json_login 登录;登录过程不起作用;

Symfony 4 API 平台和 JWT:如何使用 Symfony 客户端项目登录 API?

如何使用 symfony 4 创建登录验证表单