我是第一次与Silex的安全提供商合作,我在这个过程中遇到了问题。我目前有基本的HTTP认证工作(使用编码的示例用户,如在这里的文档中所示)。
当为表单选项切换HTTP时,登录表单正在提交,并返回到自身。我已经创建了一个UserProvider
类和loadUserByUsername
方法被成功调用,但是电子邮件没有被传递进来(被设置为"NONE_PROVIDED"
-从用户名更改)。在处理供应商代码时,我发现这是因为没有设置令牌($app['security']->getToken()
在所有点返回null)。我已经翻遍了所有能找到的文档,但我找不到任何提到这个的。
主代码包含在下面,如果有什么让我知道,谢谢!
安全提供程序配置
// Protects all routes within /auth, redirecting to /login successfully
$app->register(new SecurityServiceProvider(), array(
'security.firewalls' => array(
'unauth_area' => array(
'pattern' => '^/(?!auth)'
),
'auth_area' => array(
'pattern' => '^/.*$',
'form' => array(
'login_path' => '/login',
'check_path' => '/auth/login_check',
'default_target_path' => '/auth/overview',
),
'users' => $app->share(function () use ($app) {
return new UserProvider($app['db']);
}),
),
),
'access_control' => array(
array('path' => '^/.*$', 'role' => 'ROLE_USER'),
// Include the following line to also secure the /admin path itself
// array('path' => '^/admin$', 'role' => 'ROLE_ADMIN'),
),
));
(My Custom)方法- UserProvider类
public function loadUserByUsername($email) {
// Dying at this point shows it reaches here, but $email is null
$stmt = $this->conn->executeQuery('SELECT * FROM user WHERE email = ?', array(strtolower($email)));
if (!$user = $stmt->fetch()) {
throw new UsernameNotFoundException(sprintf('Email "%s" does not exist.', $email));
}
return new User($user['email'], $user['password'], explode(',', $user['roles']), true, true, true, true);
}
形式类
class LoginType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('_username', 'text', array(
'required' => true,
'constraints' => array(
new Assert'NotBlank(),
new Assert'Email(),
)
))
->add('_password', 'password', array(
'required' => true,
'constraints' => array(
new Assert'NotBlank(),
),
))
->add('Login', 'submit');
}
public function getName() {
return 'login';
}
}
Silex Security Provider docs
这与标记无关,我只是在
中遇到了同样的问题$app->register(new Silex'Provider'SecurityServiceProvider(), array(
'security.firewalls' => array(
'admin' => array(
'pattern' => '^/admin',
'form' => array(
'login_path' => '/',
'check_path' => '/admin/login_check',
'username_parameter'=> 'mail',
'password_parameter' => 'password',
),
'logout' => array('logout_path' => '/logout'),
//'anonymous' => true,
'users' => function () use ($app) {
return new UserProvider($app['db']);
},
)
),
'security.access_rules' => array(
array('^/$', 'IS_AUTHENTICATED_ANONYMOUSLY'),
array('^/admin', 'ROLE_USER')
)
));
经过几个小时的尝试和测试,我检查了表单输入中的name属性…见form[mail]
所以我试了
'username_parameter'=> 'form[mail]',
'password_parameter' => 'form[password]',
还有…哈利路亚!!!!!我的邮件在loadUserByUsername($mail)