使用FOSUserbundle,我想实现以下目标:
1)用户使用“用户名”和“密码”参数提交POST。密码是纯文本。
2)在控制器中,我像往常一样解析参数:
/**
* @Route("/api/token",name="api_token")
*/
public function tokenAction(Request $request) {
$username = $request->get('username');
$password = $request->get('password');
// ...
}
3)最后,如果凭证匹配,我会返回一些内容。
请注意,我希望在不修改会话的情况下执行此操作,即无需实际验证用户身份并设置令牌。我只想检查凭据是否匹配。
更新
接受的答案有效,但只能假设你有一个活跃的会话。如果您想解决只是公开REST层等(这是我的用例)的情况,您可以执行以下操作,假设您的用户名是唯一的:
/**
* @Route("/api/token",name="api_token", options={"expose"=true})
*/
public function getTokenAction(Request $request) {
$username = $request->get('username');
$password = $request->get('password');
$user = $this->getDoctrine()
->getRepository('YourUserClass')
->findOneBy(["username" => $username]);
$encoder = $this->get('security.encoder_factory')->getEncoder($user);
$isValidPassword = $encoder->isPasswordValid($user->getPassword(),
$password,
$user->getSalt());
if ($isValidPassword) {
// Handle success
} else {
// Handle error
}
}
答案 0 :(得分:2)
您应该使用身份验证服务来执行此操作,将所有代码写入控制器不是最佳做法。无论如何,对于你的回答,你可以使用这个:
/**
* @Route("/api/token",name="api_token")
*/
public function tokenAction(Request $request) {
$username = $request->get('username');
$password = $request->get('password');
// fetch your user using user name
$user = ...
//If your controller is extended from Symfony\Bundle\FrameworkBundle\Controller\Controller
$encoder = $this->get('security.encoder_factory')->getEncoder($user);
//If you are extending from other ContainerAware Controller you may have to do
//$this->container->get('security.encoder_factory')->getEncoder($user)
//Check your user
$isValidPassword = $encoder->isPasswordValid(
$user->getPassword(),
$password,
$user->getSalt()
);
if ($isValidPassword) {
//.... do your valid stuff
}else{
//... Do your in valid stuff
}
}