【发布时间】:2014-09-22 00:14:16
【问题描述】:
我的 Symfony 项目遇到问题。
我有两个 Symfony 应用程序(我们称它们为 A 和 B),它们可以通过 Web 服务相互通信。在其中一个(应用程序 A)中,我存储了我的用户列表,并且我试图通过应用程序 B 对用户进行身份验证。 预期的行为是: - 用户输入他的用户名和密码 - 应用 B 获取用户名/密码 - App B 通过 WS 调用 App A,询问此用户是否正常 - 如果用户 OK,App B 创建会话令牌并验证用户。
目前,我可以对我的用户进行身份验证,但每次浏览应用程序 B 时,我都会丢失会话令牌(因此我被重定向到我的 /login 页面)。 奇怪的是我仍然通过了身份验证,但是会话令牌不再包含我的用户对象(它包含一个每个属性为“null”的用户对象)。
这是我的 security.yml :
providers:
webservice:
id: webservice_user_provider
firewalls:
login:
pattern: ^/login$|^/check$|^/_wdt
anonymous: true
secured:
pattern: ^/
anonymous: false
form_login:
check_path: /login_check
login_path: login
username_parameter: username
password_parameter: password
default_target_path: /
logout:
path: logout
access_control:
我的登录控制器(应用程序 B):
公共函数 checkAction(请求 $request)
{
// Récupération du login et du mot de passe dans les paramètres de la requête
if ($request->getMethod() == "POST")
{
$username = $request->get("username");
$password = $request->get("密码");
// Interrogation du repo pour savoir si l'utilisateur existe
$repo = $this->getDoctrine()->getRepository("EntrepotEntitiesBundle:Utilisateurecommercant");
/* @var $repo \Entrepot\EntitiesBundle\Repository\UtilisateurecommercantRepository */
$user = $repo->findByLoginAndPassword($username, $password);
if ($user != null) // On a retrouvé un utilisateur => OK
{
// On sérialise alors un token de connexion dans la session
$this->login($request, $user);
return $this->indexAction();
}
}
return $this->render('EntrepotUtilisateurBundle::index.html.twig', array(
'last_username' => $this->getRequest()->getSession()->get(SecurityContext::LAST_USERNAME),
));
}
public function login(Request $request, UserInterface $user)
{
$token = new UsernamePasswordToken($user, $user->getPassword(), 'secured', $user->getRoles());
$request->getSession()->set('_security_secured', serialize($token));
$this->get("security.context")->setToken($token);
// Et on lève un évènement "login"
$event = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
}
我不明白的一件事是应该何时以及如何调用 checkAction()。目前,只有当我的用户验证他的登录表单时才会调用它。每次我尝试导航到新页面时都应该调用它吗?我真的不明白它是如何工作的,我想更好地理解它......
我是不是忘记了什么?
谢谢。
【问题讨论】:
-
checkAction()的使用方式与您所说的完全一样,即:不应每次都调用它。关于防火墙我遇到了类似的问题,并通过共享防火墙的上下文解决了它。阅读symfony.com/doc/current/book/security.html :常见的陷阱。但是我不知道这如何转化为 WS 身份验证。
标签: symfony session authentication token provider