我们正在Symfony 2中从头开始构建一个商业应用程序,而我在用户注册流程中遇到了一点障碍:用户创建帐户后,他们应该使用这些凭据自动登录,而不是立即被迫再次提供凭据.

有没有人有过这方面的经验,或者能为我指出正确的方向?

推荐答案

Symfony 4.0

这个过程没有从Symfony 3更改为4,但下面是一个使用新推荐的AbstractController的示例.security.token_storagesession服务都在父getSubscribedServices方法中注册,因此您不必在控制器中添加这些服务.

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use YourNameSpace\UserBundle\Entity\User;

class LoginController extends AbstractController{

    public function registerAction()
    {    
        $user = //Handle getting or creating the user entity likely with a posted form
        $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
        $this->container->get('security.token_storage')->setToken($token);
        $this->container->get('session')->set('_security_main', serialize($token));
        // The user is now logged in, you can redirect or do whatever.
    }

}

Symfony 2.6.x - Symfony 3.0.x

从symfony 2.6开始,security.context已弃用,取而代之的是security.token_storage.控制器现在可以简单地执行以下操作:

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use YourNameSpace\UserBundle\Entity\User;

class LoginController extends Controller{

    public function registerAction()
    {    
        $user = //Handle getting or creating the user entity likely with a posted form
        $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
        $this->get('security.token_storage')->setToken($token);
        $this->get('session')->set('_security_main', serialize($token));
    }

}

虽然这是不推荐的,但您仍然可以使用security.context,因为它已被设置为向后兼容.准备好为Symfony 3更新它.

您可以在此处阅读有关2.6版安全更改的更多信息:https://github.com/symfony/symfony/blob/2.6/UPGRADE-2.6.md

Symfony 2.3.x

要在symfony 2.3中实现这一点,您不能再仅仅在安全上下文中设置令牌.您还需要将令牌保存到会话.

假设安全文件带有防火墙,如:

// app/config/security.yml
security:
    firewalls:
        main:
            //firewall settings here

控制器动作类似于:

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use YourNameSpace\UserBundle\Entity\User;

class LoginController extends Controller{

    public function registerAction()
    {    
        $user = //Handle getting or creating the user entity likely with a posted form
        $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
        $this->get('security.context')->setToken($token);
        $this->get('session')->set('_security_main',serialize($token));
        //Now you can redirect where ever you need and the user will be logged in
    }

}

对于令牌创建,您需要创建一个UsernamePasswordToken.这接受4个参数:用户实体、用户凭据、防火墙名称、用户角色.您不需要提供令牌有效的用户凭据.

如果你只是想马上重定向,我不能security.context%确定是否有必要将令牌设置为security.context.但它似乎不疼,所以我把它留下了.

然后是重要的部分,设置会话变量.变量命名约定是_security_后跟防火墙名称,在本例中是main_security_main.

Php相关问答推荐

PHP和可选函数参数

Laravel 10查询中的多个where子句

自定义WooCommerce查询字符串仅显示前3个产品

FatFreeFramework上的不同路由

如何优化-PHP 7.3.14+Laravel 6

在Woocommerce变量产品中的标签附近显示所选属性选项名称

无法使用php IMAP从Gmail获取收件箱

如果为布尔值,则 for each 循环重新启动

移动应用:在PHP中忽略Cookie?

升级到PHP 8.2后无法删除cURL Cookie文件

PHP Laravel 迁移文件不创建关系

有没有办法获取触发流操作的页面的 URI?

如何显示所有数组数据而不仅仅是最后的结果

计算添加到购物车的点击次数并将其显示在 WooCommerce 管理产品列表中

PHP 中的 libgd 无法读取 Apache 配置中的 SetEnv GDFONTPATH

Symfony:指定 data_class 时,提交的表单获取初始化前不得访问

在WooCommerce我的账户单个订单页面中添加订单商品部分和按钮

如何在自定义消息中包含 WooCommerce 选定的产品变体详细信息

php var_dump(1) 返回字符串(4)

从 CSV 文件 seeder 数据库时的额外行