在Symfony2应用程序中验证用户

时间:2014-08-16 00:15:07

标签: php symfony

听起来很奇怪,但请耐心等待。我已经构建了一个symfony2应用程序,它在Web上运行得很好。

该领域的一些用户在现场手机上访问应用程序时遇到了很多麻烦,因为我们都知道symfony有多重。情况非常糟糕我被迫大量缩减他们对四页访问的访问权限,只有三个php文件,一个用于身份验证,一个用于数据输入,一个用于查看他们的条目,所有这些都不使用symfony2但是普通的PHP。

现在我的问题是,如何根据数据库密码/盐检查密码?

我使用FOSUserBundle来提高安全性

2 个答案:

答案 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);
}