SecurityBundle 负责把 Security组件 整合到Symfony 框架中。在Symfony 3.3中我们对它进行了一些微小改进。

重命名的FirewallContext#getContext()

此方法名容易误导,因为它只是返回由 FirewallMapInterface::getListeners() 所返回的监听。因此我们决定不建议使用此方法,并把它重命名为 FirewallContext#getListeners()

改进的UserPasswordEncoderCommand

security:encode-password 命令十分有用,可在程序开发中加密用户的密码,或者对存储在 security.yml 文件中的用户进行加密。在Symfony 3.3中,这个命令更加智能,将显示你的程序中的可用的User类的完整列表,,因此你只需选中其中的一个,而不是输入User类的完整名称:

1
2
3
4
5
6
7
8
$  ./bin/console security:encode-password
 
  For which user class would you like to encode a password?
  [0] App\Entity\User
  [1] Custom\Class\Bcrypt\User
  [2] Custom\Class\Pbkdf2\User
  [3] Custom\Class\Test\User
  [4] Symfony\Component\Security\Core\User\User

不要normalize“in-memory用户"的用户名

把email这样的属性用作程序中用户的名称是常见的。然而,Symfony会对定义在 security.providers.in_memory.users 下面的键进行标准化(mnormalize),因此 foo-bar@gmail.com 会变成 foo_bar@gmail.com 进而导致验证失败。

在Symfony 3.3中我们改变了此种行为,那些键/用户名将不以任何方式进行标准化或是被修改。

强化版logout链接的自动生成

当使用类似 logout_path() 这种助手而不提供任何参数时,Symfony会为当前活跃的防火墙生成logout链接。在Symfony 3.3我们改进了其行为以便更好地解决一些特例。以下是它的流程:

  • 尝试找出token的键 (除非它是一个anonymous匿名token);
  • 若找到,尝试从key中获得listener。如果监听被找到,停止;
  • 尝试从被注入的firewall key中寻找。如果监听被找到,停止;
  • 尝试从被注入的firewall context寻找。如果监听被找到,停止。