1

我正在尝试调整FOSUserBundle以使用我的 Neo4j 数据库,但我似乎无法让它工作。经过很长时间尝试实现我自己的用户系统但没有任何运气(在 Symfony2 中设置 NEO4j),我开始尝试使用FOSUserBundle.

我使用了以下文章和存储库:

https://github.com/ikwattro/Neo4jUserBundle 我已经把它复制到我的UserBundle. 我已经改变了namespaces.

我从这里获取了图形管理器:https ://github.com/ikwattro/KwattroNeo4jOGMBundle

其余的,我遵循了FOSUserBundle文档。

现在,当我进入注册表时,所有字段都会出现,我可以填写我喜欢的凭据。这行得通。单击提交后,我被重定向到成功页面,在该页面上显示警报覆盖:

加载 Web 调试工具栏时出错(500:内部服务器错误)。是否要打开分析器?

如果我随后进入分析器,我可以看到我已成功获得授权并以我刚刚创建的用户身份登录。数据也成功保存在我的neo4j数据库中。

现在的问题是,如果我转到 Symfony 项目的任何其他页面,我会再次以匿名身份登录。如果我进入登录页面,表单会正确显示,但它总是返回:Invalid credentials

我猜,我的会话或安全性有问题吗?

这是我的security.yml:

security:
  encoders:
    FOS\UserBundle\Model\UserInterface: bcrypt
    Neo4jUserBundle\Entity\User: bcrypt

  role_hierarchy:
    ROLE_ADMIN: ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

  providers:
    fos_userbundle:
      id: neo4j.user_provider.username

  firewalls:
    main:
      pattern: ^/
      form_login:
        provider: fos_userbundle
        csrf_provider: security.csrf.token_manager
      logout: true
      anonymous: true

  access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }

我不知道这些信息是否有帮助或相关,但在Request注册后右侧的分析器中(当用户仍然经过正确身份验证时)这是会话信息:

Session Metadata
Key           Value
Created       Tue, 21 Jul 15 17:27:34 +0200    
Last used     Tue, 21 Jul 15 17:27:34 +0200    
Lifetime      0

Session Attributes
Key                        Value
_csrf/authenticate         A_H4Ul1XHFYoxQdOirdmbBQRRCJ01Xh8EkGeC6Y7xw0    
_csrf/registration         OAXAXhfhcN6z0WekMN0fk8zg4ikk5uCCZBlvhy8DyVY    
_security.last_username    test    
_security_main             C:74:"Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken":444:{a:3:{i:0;N;i:1;s:4:"main";i:2;s:404:"a:4:{i:0;C:32:"neo4jProxyUserBundle_Entity_User":192:{a:9:{i:0;s:60:"$2y$13$e49oj61cdjk88kk040wg8exlwqVzbdQB5IVNG18Wqcbe.EW8KXi72";i:1;s:31:"e49oj61cdjk88kk040wg8kcc4cg40c4";i:2;s:4:"test";i:3;s:4:"test";i:4;b:0;i:5;b:0;i:6;b:0;i:7;b:1;i:8;i:66;}}i:1;b:1;i:2;a:1:{i:0;O:41:"Symfony\Component\Security\Core\Role\Role":1:{s:47:"Symfony\Component\Security\Core\Role\Rolerole";s:9:"ROLE_USER";}}i:3;a:0:{}}";}}

Flashes
Key               Value
success           [0 => registration.flash.user_created, 1 => registration.flash.user_created, 2 => registration.flash.user_created, 3 => registration.flash.user_created, 4 => registration.flash.user_created, 5 => registration.flash.user_created, 6 => registration.flash.user_created, 7 => registration.flash.user_created, 8 => registration.flash.user_created]

任何帮助或提示将不胜感激。

更新 [21.07.2015]

我现在已经创建了一个存储库:https ://github.com/JoranBeaufort/Neo4jUserBundle (我希望这可行,我第一次使用 GitHub)

我想会话处理有问题吗?

需要指出的另一件事是,依赖注入似乎没有做任何事情。我一定错过了一些重要的事情。

如果能够提供一个Neo4jUserBundle开箱即用的工具,FOSUserBundle并且可以在 Symfony 项目的配置文件中进行配置,那就太好了。伟大而重要的也是数据库的身份验证(使用用户名和密码连接到neo4j)。

更新 [22.07.2015]

我已经改变了bundlename,我想我终于DependencyInjection可以开始工作了。我不太确定,但我认为我的班级命名方式有问题。

我也试过你的建议findUserById。我编写了一个控制器,它采用路由myapp.com/neo4juser/debug/finduserbyid/{id},然后使用该findUserById方法返回用户。这是有效的。我的 Neo4j 数据库中有一个用户,ID = 68,email=test@test.test。如果我现在进入myapp.com/neo4juser/debug/finduserbyid/68页面加载显示该用户的正确电子邮件。

可以在这里找到 TWIG:https ://github.com/JoranBeaufort/Neo4jUserBundle/blob/master/Resources/views/Debug/finduserbyid.html.twig

和这里的控制器:https ://github.com/JoranBeaufort/Neo4jUserBundle/blob/master/Controller/DebugController.php

中的方法UserManager似乎正在返回所需的对象。

这是否有助于弄清楚为什么登录不起作用?序列化是否与错误或加密类型有关?还是与 CSRF 有关?任何进一步的提示?

更新 [23.07.2015]

in_memory用作提供者并设置用户时in_memory,登录有效。因此,现在我已将问题范围缩小到提供者。

我越来越近了!现在 dev.log 文件中的错误为:

[2015-07-23 17:11:54] security.INFO: Authentication request failed. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): Bad credentials. at bla/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php:73, Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException(code: 0): Username \"test\" does not exist. at bla/src/Neo4jUserBundle/Security/UserProvider.php:42)"} []

重要的是“用户名“测试”部分不存在。我猜这意味着用户提供程序中的某些内容不起作用。谁能发现问题可能是什么?我正在调用的提供者可以在这里找到:https ://github.com/JoranBeaufort/Neo4jUserBundle/tree/master/Security

4

2 回答 2

0

我想说的问题是,截至 27/12/2015,第 73 行的 UserManager 没有返回找到的用户(是一个 void 函数)。我还没有尝试过,几天都不能尝试,也许这是一个不再寻求的答案,但我很确定这就是问题所在。

由于@return 标签,IDE 不会发现它有问题:

* Finds a user by username
 *
 * @param string $username
 *
 * @return UserInterface
 */
public function findUserByUsername($username)
{
    $this->findUserBy(array('usernameCanonical' => $this->canonicalizeUsername($username)));
}
于 2015-12-27T07:38:21.900 回答
0

好的。我打开了一个 PR 进行了一些调整,但我无法让这些东西正常工作。

我所做的调整是增加了通过 neo4j_user 配置定义用户和密码的可能性,并在 DI 扩展中加载 services.yml 文件。

当我注册一个用户时,它会在数据库中很好地创建。然而,为了获取用户,经过一些调试,我可以看到底层客户端(neo4jphp 与 neo4j-php-ogm 结合使用)正在使用旧索引,并且在这个阶段抛出了一些错误。

除了告诉您在开始时不要使用 ogm 并尝试使用原始密码查询外,我无能为力。

恐怕首先尝试更新使用的两个库可能很困难。

于 2015-07-24T14:37:30.973 回答