如何使用Silex / Symfony中的刚刚注册的SimpleUser登录安全区域?

时间:2016-04-20 13:46:29

标签: php symfony silex symfony-security

我正在寻求使用SimpleUser for Silex的帮助。 我的composer.json在需要的时候可用。

在SimpleUser中,我们可以访问页面以允许用户自己注册(并可能确认他们的电子邮件)。如果没有确认电子邮件,这些用户会在完成注册表单后自动登录(通过RegisterAction89loginAsUser在线114上调用。)

我假设在记录之后,用户可以访问我的安全区域,即使尚未授予大多数页面/功能(稍后由管理员手动完成)。

实际完成的是,在注册之后,当我调用任何网址时,我得到了302 redirection到根/页面(如果没有授予使用页面的权限,则由我的控制器完成),然后我的另一个302 redirection(自动完成)到我的登录URL。我在日志中看到抛出异常:

An AuthenticationException was thrown; redirecting to authentication entry point. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException(code: 0): A Token was not found in the TokenStorage. at C:\\path\\to\\wamp\\www\\Easytrip2\\vendor\\symfony\\security\\Http\\Firewall\\AccessListener.php:53)"} []

这里的要点是登录页面知道用户,因为它显示了名称,电子邮件等。因此用户肯定已登录。

总结一下,我的问题是第四步:

  1. 以匿名方式访问网页
  2. 获取reidrected到登录页面,
  3. 注册为用户
  4. 尝试访问(手动或使用链接)任何页面重定向到root(预期)和root重定向到登录表单(不是预期的),
  5. 看到您已登录登录页面。
  6. 经过几个小时的挖掘代码后,我的想法发现了两个有趣的观点:

    • 抛出的异常是合法的:实际上没有token_storage。在构造函数之后,我发现在注册SecurityServiceProvider314时应该填充它。从这里我猜我的防火墙设置错误了......
    • 我尝试调试并观察$app['security.token_storage']内部的内容,只要我使用完全正常工作且注册的用户或新注册的用户访问页面,它就为空。
    • 我看了loginAsUser函数,发现一些奇怪的东西。令牌从当前值更改为用于对用户进行身份验证的新令牌。值authenticateduserkey已从true"anon.""public"更改为falseSimpleUser\\User"public"(该属性已从key更改为providerKey)。它能来自这里吗?

    编辑1: 在与Symfony朋友呆了一段时间之后,我发现在注册新用户时(因此在公共防火墙中),loginAsUser(参见上面列表中的最后一个项目符号点)会使令牌交换机考虑到此防火墙。更改公共防火墙名称时,它会更改$currentToken->key$token->providerKey。我认为这与误解有关:我们无法登录属于另一个防火墙的页面上的防火墙。是吗?

    那么,你知道我做错了什么吗?

    以下是我的代码:

    composer.json:

    {
        "require": {
            "silex/silex": "~1.3",
            "doctrine/dbal": "2.5.*",
            "symfony/security": "2.7.*",
            "twig/twig": "1.21.*",
            "symfony/twig-bridge": "2.7.*",
            "symfony/form": "2.7.*",
            "symfony/translation": "2.7.*",
            "symfony/config": "2.7.*",
            "jasongrimes/silex-simpleuser": "*",
            "twig/extensions": "1.3.*",
            "symfony/validator": "2.*",
            "phpoffice/phpexcel": "1.*",
            "symfony/monolog-bridge": "*",
            "box/spout": "*"
        },
        "require-dev": {
            "phpunit/phpunit": "*",
            "symfony/browser-kit": "*",
            "symfony/css-selector": "*",
            "silex/web-profiler": "*"
        },
        "autoload":{
            "psr-4":{"Easytrip2\\": "src"}
        },
        "autoload-dev":{
            "psr-4":{"Easytrip2\\": "tests"}
        }
    }
    

    经典控制器代码:

    public function fileSearchAction(Request $request, Application $app) {
        if ($app ['security.authorization_checker']->isGranted ( 'IS_AUTHENTICATED_FULLY' ) and $app ['security.authorization_checker']->isGranted ( 'ROLE_FOLLOWUP' )) {
            //Do something and return
        } else {
            $app ['session']->getFlashBag ()->add ( 'error', 'Don\'t have the rights...' );
            return $app->redirect ( $app ['url_generator']->generate ( 'home' ) );
        }
    }
    

    我的防火墙:

    $app->register ( new Silex\Provider\SecurityServiceProvider (), array (
            'security.firewalls' => array (
                    'public' => array (
                            'pattern' => '^/user/(login|logout|register)$',
                            'form' => array (
                                    'login_path' => '/user/login',
                                    'check_path' => '/user/login_check'
                            ),
                            'logout' => array (
                                    'logout_path' => '/user/logout',
                                    'invalidate_session' => true
                            ),
                            'anonymous' => true,
                            'users' => $app->share ( function () use ($app) {
                                return $app ['user.manager'];
                            } )
                    ),
                    'secured' => array (
                            'pattern' => '^(/|(/user/.*)|(/view/.*)|(/search/.*)|(/admin/.*))$',
                            'form' => array (
                                    'login_path' => '/user/login',
                                    'check_path' => '/user/login_check'
                            ),
                            'logout' => array (
                                    'logout_path' => '/user/logout',
                                    'invalidate_session' => true
                            ),
                            'anonymous' => false,
                            'users' => $app->share ( function () use ($app) {
                                return $app ['user.manager'];
                            } )
                    )
            )
    ) );
    

    我的家乡路线:

    $app->get ( '/', "Easytrip2\Controller\HomeController::indexAction" )->bind ( 'home' );
    

    如果您需要更多信息,请与我们联系。

    我知道我应该将权利管理到$app['security.access_rules'],这是下一个改进之一。但它不应该导致这个问题。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我对来自line 114的{​​{1}} UserController.php进行了评论。 IMO,我们不应该尝试在公共页面中记录用户:symfony / silex属性链接到公共防火墙的令牌,因此拒绝任何对安全页面的访问。

现在一切都很好,谢谢你的帮助!