php – 在Silex中使用db支持的UserProvider进行用户身份验证
发布时间:2020-12-13 13:27:50 所属栏目:PHP教程 来源:网络整理
导读:我正在开发一个Silex应用程序,现在我处于安全阶段.我已经阅读了我在网上发现的关于这个主题的所有文档,但我有很多疑问,如果可能的话,我希望有人能帮助我. 基本上我跟着this tutorial from Johann Reinke. 自然而然的是Silex documentation: 也是我在谷歌上
|
我正在开发一个Silex应用程序,现在我处于安全阶段.我已经阅读了我在网上发现的关于这个主题的所有文档,但我有很多疑问,如果可能的话,我希望有人能帮助我.
基本上我跟着this tutorial from Johann Reinke. 自然而然的是Silex documentation: 也是我在谷歌上发现的一切. 但是,我认为Silex仍然缺乏大量文档,我在很多方面都迷失了. 我的代码: $app->register(new SilexProviderSessionServiceProvider(),array(
'session.storage.save_path' => __DIR__.'/../vendor/sessions',));
$app->register(new SilexProviderDoctrineServiceProvider(),array(
'db.options' => array(
'driver' => 'pdo_mysql','host' => 'localhost','dbname' => 'dbname','user' => 'someuser','password' => 'somepass','charset' => 'utf8',),));
$app['security.encoder.digest'] = $app->share(function ($app) {
return new MessageDigestPasswordEncoder('sha1',false,1);
});
$app['security.firewalls'] = array(
'acceso' => array(
'pattern' => '^/confirmar','form' => array('login_path' => '/acceso','check_path' => '/confirmar/comprobar_acceso'),'logout' => array('logout_path' => '/confirmar/salir'),'users' => $app->share(function() use ($app) {
return new AcmeUserUserProvider($app['db']);
}),);
$app->register(new SilexProviderSecurityServiceProvider(array(
'security.firewalls' => $app['security.firewalls'],'security.access_rules' => array(
array('^/confirmar','ROLE_USER'),)));
我对控制器有很多疑问: $app->match('/acceso',function(Request $request) use ($app) {
$username = $request->get('_username');
$password = $request->get('_password');
if ('POST' == $request->getMethod())
{
$user = new AcmeUserUserProvider($app['db']);
$encoder = $app['security.encoder_factory']->getEncoder($user);
// compute the encoded password
$encodedPassword = $encoder->encodePassword($password,$user->getSalt());
// compare passwords
if ($user->password == $encodedPassword)
{
// set security token into security
$token = new UsernamePasswordToken($user,$password,'',array('ROLE_USER'));
$app['security']->setToken($token);
//return $app->redirect('/jander');
// redirect or give response here
} else {
// error feedback
}
}
return $app['twig']->render('login.twig',array(
'error' => $app['security.last_error']($request),'last_username' => $app['session']->get('_security.last_username'),));
})
->bind('acceso');
这是我的班级,用户提供者: // src/Acme/User/UserProvider.php
namespace AcmeUser;
use SymfonyComponentSecurityCoreUserUserProviderInterface;
use SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyComponentSecurityCoreUserUser;
use SymfonyComponentSecurityCoreExceptionUsernameNotFoundException;
use SymfonyComponentSecurityCoreExceptionUnsupportedUserException;
use DoctrineDBALConnection;
class UserProvider implements UserProviderInterface
{
private $conn;
public function __construct(Connection $conn)
{
$this->conn = $conn;
}
public function loadUserByUsername($username)
{
$stmt = $this->conn->executeQuery('SELECT * FROM compradores WHERE idemail = ?',array(strtolower($username)));
if (!$user = $stmt->fetch()) {
throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.',$username));
}
return new User($user['idemail'],$user['pass'],explode(',',$user['roles']),true,true);
}
public function refreshUser(UserInterface $user)
{
if (!$user instanceof User) {
throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.',get_class($user)));
}
return $this->loadUserByUsername($user->getUsername());
}
public function supportsClass($class)
{
return $class === 'SymfonyComponentSecurityCoreUserUser';
}
}
我的表格: <form action="{{ path('confirmar_comprobar_acceso') }}" method="post">
{{ error }}
<input type="text" name="_username" value="{{ last_username }}" />
<input type="password" name="_password" value="" />
<input type="submit" />
</form>
这是我的mysql表: id int(15) idemail varchar(255) nombre varchar(255) apellidos varchar(255) telefono int(11) activo tinyint(4) pass varchar(40) roles varchar(255) iva tinyint(4) nifcif varchar(255) 尝试登录时,我总是收到“Bad credentials”响应.有任何想法吗?谢谢,干杯!
在40个字符处,您的密码字段“pass”可能会截断加密的密码.尝试将字段更改为varchar(255)
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
