在Symfony2中使用Neo4j和FOSUserBundle

时间:2015-07-21 15:38:29

标签: symfony neo4j fosuserbundle

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

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

https://github.com/ikwattro/Neo4jUserBundle 我已经把这个并将所有文件复制到我的UserBundle中。我更改了名称空间。

我从这里开始使用图表管理器:https://github.com/ikwattro/KwattroNeo4jOGMBundle

其余的,我已经关注了FOSUserBundle文档。

现在,当我转到注册表单时,所有字段都会出现,我可以填写我的首选凭据。这有效。点击提交后,我会被重定向到成功页面,在该页面上会显示警告覆盖:

An error occurred while loading the web debug toolbar (500: Internal Server Error).

Do you want to open the profiler?

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

现在的问题是,如果我去Symfony项目的任何其他页面,我再次以匿名身份登录。如果我转到登录页面,表单显示正确,但始终显示:Invalid credentials.

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

这是我的security.yml:

安全性:     编码器:         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 }

我不知道这些信息是否有帮助或相关,但是在注册后的“请求”下的分析器中(当用户仍然正确认证时)这是会话信息:

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)

我的猜测是他们的会话处理是什么?

另一点需要指出的是,依赖注入似乎没有做任何事情。我必须遗漏一些重要的事情。

这是我的日志文件的相关部分: 因尺寸而被删除

能够提供与FOSUserBundle开箱即用的Neo4jUserBundle并且可以在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

此处的CONTROLLER: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)"} []

重要的是部分Username \"test\" does not exist。我猜这意味着某些东西在用户提供商中无效。谁能发现问题可能是什么?我可以在此处找到我呼叫的提供商:https://github.com/JoranBeaufort/Neo4jUserBundle/tree/master/Security

2 个答案:

答案 0 :(得分:0)

确定。我开了一个公关进行一些调整,但我无法让这些东西工作。

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

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

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

我担心尝试更新所使用的两个库可能在第一时间很难。

答案 1 :(得分:0)

我想说的问题,截至2015年12月27日,第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)));
}