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 日志会告诉我,那就太好了......)
我正在尝试使用 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 日志会告诉我,那就太好了......)