【问题标题】:Silex Security Provider - Token failing to be setSilex 安全提供程序 - 未能设置令牌
【发布时间】:2014-06-15 21:21:41
【问题描述】:

我是第一次与 Silex 的安全提供商合作,但我遇到了流程问题。我目前有基本的 HTTP 身份验证工作(使用编码示例用户,如 here in the docs 所示)。

当为表单选项切换 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'),
    ),
));

(我的自定义)方法 - 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

【问题讨论】:

  • 您也可以发布您的表格吗?用户名元素是否仍称为“_username”?
  • 另外,为了确保,请检查:If you're using a form to authenticate users, you need to enable SessionServiceProvider.
  • 我已包含该表单,我已将其恢复为“_username”以使其正常工作(我达到了漫无目的的修补阶段,所以我尝试了各种方法)。包含依赖项(composer)并注册了安全提供程序,如果这就是您的意思吗?
  • 抱歉,重读一遍,但是会话提供程序也已启用是(并且在安全提供程序之前注册)
  • 你是否仍然收到一个空的 $email 传递给UserProvider ::loadUserByUsername($email) 并且表单输入字段设置为_username?

标签: php authentication silex


【解决方案1】:

这与令牌无关......我只是遇到了同样的问题

$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')
        )
));

经过几个小时的尝试和测试,我检查了表单输入中的名称属性……看到了form[mail]

所以我尝试了

'username_parameter'=> 'form[mail]',
'password_parameter' => 'form[password]',

还有……哈利路亚!!!!我的邮件在loadUserByUsername($mail)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-04
    • 2021-01-23
    • 2016-08-21
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多