Symfony2 / SonataUserBundle - 注册后自动登录
Symfony2 / SonataUserBundle - Automatic Login after Registration
在我的项目中,我使用 Symfony 2.8、SonataAdminBundle 和 SonataUserBundle。
我覆盖了 FOSUserBundle 中 RegistrationController 的 registerAction。成功注册后,我希望用户自动登录到 SonataAdmin 后端。
处理我的注册后,我在操作中调用它:
$userManager->updateUser($user);
$response = new RedirectResponse($this->generateUrl('sonata_admin_dashboard'));
$this->authenticateUser($user, $response);
$this->setFlash('notice', 'success!');
return $response;
我的 FOSUser 配置如下所示:
fos_user:
db_driver: orm
firewall_name: admin
user_class: Application\Sonata\UserBundle\Entity\User
service:
user_manager: sonata.user.orm.user_manager
registration:
confirmation:
enabled: false
form:
validation_groups: [pwValidation]
我的 security.yml
看起来像这样:
firewalls:
admin:
pattern: /admin/(.*)
context: admin
form_login:
provider: fos_userbundle
login_path: /admin/login
use_forward: true
check_path: /admin/login_check
failure_path: null
default_target_path: /admin/dashboard
always_use_default_target_path: true
logout:
path: /admin/logout
anonymous: true
每次我注册一个新用户时,我都会被重定向到带有 401 状态码的 SonataAdmin 登录屏幕,并且 Symfony 分析器说我已经通过 AnonymousToken 进行了身份验证。
我已经尝试跳过该功能
$this->authenticateUser($user, $response);
并手动调用:
$token = new UsernamePasswordToken($user, null, 'admin', $user->getRoles());
$this->container->get('security.token_storage')->setToken($token);
$this->container->get('session')->set('_security_main', serialize($token));
但如果我尝试这样做,我会得到相同的行为。
有人能告诉我我做错了什么吗?
我找到了自动身份验证不起作用的原因。
问题是我的 /register
路由不在我要验证用户身份的防火墙后面。
我将路线更改为 /admin/register
并将此路线的 access_control
设置设置为:
-{ path: ^/admin/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
之后通过调用方法$this->authenticateUser($user, $response);
正确验证了用户
在我的项目中,我使用 Symfony 2.8、SonataAdminBundle 和 SonataUserBundle。
我覆盖了 FOSUserBundle 中 RegistrationController 的 registerAction。成功注册后,我希望用户自动登录到 SonataAdmin 后端。
处理我的注册后,我在操作中调用它:
$userManager->updateUser($user);
$response = new RedirectResponse($this->generateUrl('sonata_admin_dashboard'));
$this->authenticateUser($user, $response);
$this->setFlash('notice', 'success!');
return $response;
我的 FOSUser 配置如下所示:
fos_user:
db_driver: orm
firewall_name: admin
user_class: Application\Sonata\UserBundle\Entity\User
service:
user_manager: sonata.user.orm.user_manager
registration:
confirmation:
enabled: false
form:
validation_groups: [pwValidation]
我的 security.yml
看起来像这样:
firewalls:
admin:
pattern: /admin/(.*)
context: admin
form_login:
provider: fos_userbundle
login_path: /admin/login
use_forward: true
check_path: /admin/login_check
failure_path: null
default_target_path: /admin/dashboard
always_use_default_target_path: true
logout:
path: /admin/logout
anonymous: true
每次我注册一个新用户时,我都会被重定向到带有 401 状态码的 SonataAdmin 登录屏幕,并且 Symfony 分析器说我已经通过 AnonymousToken 进行了身份验证。
我已经尝试跳过该功能
$this->authenticateUser($user, $response);
并手动调用:
$token = new UsernamePasswordToken($user, null, 'admin', $user->getRoles());
$this->container->get('security.token_storage')->setToken($token);
$this->container->get('session')->set('_security_main', serialize($token));
但如果我尝试这样做,我会得到相同的行为。
有人能告诉我我做错了什么吗?
我找到了自动身份验证不起作用的原因。
问题是我的 /register
路由不在我要验证用户身份的防火墙后面。
我将路线更改为 /admin/register
并将此路线的 access_control
设置设置为:
-{ path: ^/admin/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
之后通过调用方法$this->authenticateUser($user, $response);