听起来很奇怪,但请耐心等待。我已经构建了一个symfony2应用程序,它在Web上运行得很好。
该领域的一些用户在现场手机上访问应用程序时遇到了很多麻烦,因为我们都知道symfony有多重。情况非常糟糕我被迫大量缩减他们对四页访问的访问权限,只有三个php文件,一个用于身份验证,一个用于数据输入,一个用于查看他们的条目,所有这些都不使用symfony2但是普通的PHP。
现在我的问题是,如何根据数据库密码/盐检查密码?
我使用FOSUserBundle来提高安全性
答案 0 :(得分:1)
您确定要使用FOSUserBundle进行安全保护吗? I think you'll find you're using the core SecurityBundle for that。用户密码的存储方式为depend on how you have configured the security system。
MessageDigestPasswordEncoder是用于对密码进行编码的内容。从查看该代码,您可以根据需要复制它。它的要点是合并密码和salt($password.'{'.$salt.'}'
),然后通过PHP的哈希函数hash($this->algorithm, $salted, true)
运行它,无论需要多次迭代。
虽然与您提出的问题没有特别相关,但我对于缩小移动用户的PHP意味着什么感到困惑?对于移动设备而言,服务器页面生成与桌面用户一样长,那么为什么要在symfony框架之外重新实现呢?
答案 1 :(得分:1)
您可以使用用户管理器检查用户凭据的有效性。我为这样的任务创造了以下功能。
/**
* authorize user by username and password
*
* @param string $username
* @param string $raw_password
*/
public function authUserByUsernamePassword($username, $raw_password) {
$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserByUsername($username);
// username not found
if (!$user) {
throw new \Exception("User with username: $username not found!", 0);
}
$encoder_service = $this->container->get('security.encoder_factory');
$encoder = $encoder_service->getEncoder($user);
$encoded_pass = $encoder->encodePassword($raw_password, $user->getSalt());
if($encoded_pass != $user->getPassword()){
throw new \Exception("wrong password!", 0);
}
// Get UsernamePasswordToken
$token = new UsernamePasswordToken($user, $user->getPassword(), 'main', $user->getRoles());
// Set token
$this->authUserByToken($token);
return $this->getUserToken($user);
}