我的Symfony项目遇到了问题。
我有两个可以通过Web服务相互通信的Symfony应用程序(我们称之为A和B)。在其中一个(应用程序A)中,我存储了我的用户列表,我正在尝试通过应用程序B对用户进行身份验证。 预期的行为是: - 用户输入他的用户名和密码 - 应用B获取用户名/密码 - 应用B通过WS调用App A,询问该用户是否正常 - 如果用户确定,则App B会创建会话令牌并对用户进行身份验证。
目前,我可以对我的用户进行身份验证,但每次浏览应用B时,都会丢失会话令牌(因此我会重定向到我的/登录页面)。 奇怪的是我仍然经过身份验证,但会话令牌不再包含我的User对象(它包含一个User对象,每个属性都为“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:
我的LoginController(应用B):
public function checkAction(Request $ request)
{
//Récupérationdulogin et du mot de passe danslesparamètresdelarequête
if($ request-> getMethod()==“POST”)
{
$ username = $ request-> get(“username”);
$ password = $ request-> get(“password”);
// 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()
何时以及如何被召唤。此时,仅在我的用户验证其登录表单时才会调用它。每次我尝试导航到新页面时是否应该调用它?我真的不明白它是如何工作的,我想更好地理解它......
我忘记了什么吗?
感谢。
答案 0 :(得分:0)
您必须为form_login设置提供程序密钥,即:
form_login:
...
provider: webservice
答案 1 :(得分:0)
我已经能够使用此链接解决我的问题:
很好地解释,我理解得很好,我现在能够通过我的WS验证用户:)