我正在尝试使用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.
消息。
为什么我收到这个错误的凭据消息?我忘记了什么吗?我搞砸了一些配置吗?
由于
答案 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日志会告诉我那会很好......)