Silex - UserProviderInterface始终返回“错误凭据”

时间:2016-10-15 16:06:38

标签: php symfony authentication silex

我正在尝试使用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 UserProvider implements UserProviderInterface
{
    public function loadUserByUsername($username)
    {     
        return new User('blabla', 'patate', ['ROLE_ADMIN'], true, true, true, true);
    }
}

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

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

由于

2 个答案:

答案 0 :(得分:1)

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

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();
};

答案 1 :(得分:0)

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

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

如果不是,则隐式抛出“Bad credentials”错误。 (如果silex日志会告诉我那会很好......)