Silex - UserProviderInterface 总是 returns "Bad credentials"

Silex - UserProviderInterface always returns "Bad credentials"

我正在尝试使用 SecurityProvider 将保存在数据库中的用户添加到我的 Silex 网站。

我注册了安全提供商

$app['security.firewalls'] = array
(
    'admin' => array
    (
        'pattern' => '^/admin',
        'form' => array('login_path' => '/login', 'check_path' => '/admin/login_check'),
        'logout' => array('logout_path' => '/admin/logout', 'invalidate_session' => true),
        'users' => function() use($app) 
        { 
            return new Entity\UserProvider($app); 
        }
    )
);

Entity\UserProvider($app)class如下(仅显示部分代码)

class UserProvider implements UserProviderInterface
{
    public function loadUserByUsername($username)
    {     
        return new User('blabla', 'patate', ['ROLE_ADMIN'], true, true, true, true);
    }
}

但是即使我 return 是一个新用户,并且没有抛出 UsernameNotFoundException 登录页面仍然给我 Bad credentials. 消息。

为什么我会收到此错误的凭据消息?我忘了什么吗?我搞砸了一些配置吗?

谢谢

silex 和创建用户时使用的密码编码器算法不同。

silex中的编码器由参数设置security.default_encoder

$app['security.default_encoder'] = function ($app) {
    return $app['security.encoder.bcrypt'];
};
...
$app['security.encoder.bcrypt'] = function ($app) {
    return new BCryptPasswordEncoder($app['security.encoder.bcrypt.cost']);
};

在创建用户时使用 bcrypt 进行密码编码

return new User(
    'blabla',
    $app['security.encoder.bcrypt']->encodePassword('patate', ''),
    ['ROLE_ADMIN'],
    true, true, true, true
);

或将 silex 编码器更改为纯文本(无编码)以检查登录是否有效

$app['security.default_encoder'] = function ($app) {
    return new \Symfony\Component\Security\Core\Encoder\PlaintextPasswordEncoder();
};

感谢 Max P. 的回答,您引导我找到了解决方案。你让我想知道为什么你会在我使用假数据时谈论密码加密,所以我检查了如果我在所有地方都使用完全相同的值会发生什么。

唯一的问题是我使用了假数据。我假设我在登录表单中提供的数据会被直接遗忘,但实际上 Silex 确保表单中的数据与返回的用户实体中的数据匹配。

如果不是,则隐式抛出 "Bad credentials" 错误。 (如果 silex 日志会告诉我,那就太好了......)