用户对象不可访问在symfony中的控制器
问题描述:
我想在symfony中使用自动登录功能,如触发登录事件和设置用户对象。用户对象是在控制器可用,但是当我尝试使用其他控制器的用户对象说annon而不是显示登录的用户信息用户对象不可访问在symfony中的控制器
控制器A
private function autoLogin($request, $username)
{
$em = $this->getDoctrine()->getManager();
if (!$usr = $em->getRepository('AppBundle:User')->findOneBy(['username' => $username])) {
throw $this->createNotFoundException('User does not exist');
}
$token = new UsernamePasswordToken($usr, $usr->getPassword(), "secured_area", $usr->getRoles());
$this->get('security.token_storage')->setToken($token);
$loginEvent = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $loginEvent);
$user = $this->get('security.token_storage')->getToken()->getUser();
dump($user); // can see user object without any issue
if (!$this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
throw new AccessDeniedException();
}
return $usr;
}
控制器B
public function editAction(Request $request)
{
$user = $this->get('security.token_storage')->getToken()->getUser();
print_r($user); // result is annon.
}
security.yml
security:
encoders:
AppBundle\Entity\User:
algorithm: bcrypt
providers:
doctrine_provider:
entity:
class: AppBundle:User
property: username
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
secured_area:
anonymous: ~
provider: doctrine_provider
pattern: ^/
form_login:
login_path: security_login
check_path: security_login
csrf_token_generator: security.csrf.token_manager
logout:
path: /logout
target: /login
access_control:
- { path: ^/.*, roles: IS_AUTHENTICATED_ANONYMOUSLY }
答
我假设你没有使用任何安全设置,并在用户刷新页面后调用第二个控制器。
最可能的问题是您的用户没有被保存到会话中。 Symfony\Component\Security\Http\Firewall\ContextListener
负责。如果你看看onKernelResponse()
方法,你可以看看它是如何做到的。基本上它从令牌存储获取令牌,将其序列化并存储到会话中。在请求上做的相反:从会话获取令牌并将其放置到令牌存储。
我建议你使用防火墙的配置玩和设置是这样的:
firewalls:
autologin:
pattern: /autologinUrl/
context: autologing
在这种情况下上下文侦听器将被称为做会话相关的东西,你的代码应该工作。
我不知道你明白你想要做什么。您是否在控制器中登录用户,然后在下一页上用户似乎未登录?或者您是否将您的请求从一个控制器转发给另一个? – Stepashka
如果您也可以提供security.yml文件,这也会很不错。 – Stepashka
@Stepashka。我用security.yml文件内容编辑了我的问题。我试图登录一个控制器,然后在下一页用户似乎没有登录。该对象显示annon。 – user1965773