2

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

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

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

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

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. 重定向到登录页面,
  3. 注册为用户,
  4. 尝试访问(手动或使用链接)到任何页面重定向到 root(这是预期的)和 root 重定向到登录表单(不是预期的),
  5. 看到您已登录登录页面。

我的想法,经过几个小时的挖掘代码,发现了两个有趣的点:

  • 抛出的异常是合法的:实际上没有 token_storage。在构造函数之后,我发现它应该在注册 my SecurityServiceProvider, line时被填充314。从这里我想我的防火墙设置错误......
  • $app['security.token_storage']每当我使用完全正常工作和注册的用户或新注册的用户访问页面时,我都尝试调试并观察.
  • 我查看了loginAsUser函数,发现有些奇怪。令牌从当前值更改为用于对用户进行身份验证的新令牌。、 和的值从authenticateduserkey更改为、true"anon."的实例(属性从 更改为)。会不会是从这里来的?"public"falseSimpleUser\\User"public"keyproviderKey

编辑 1: 在与 Symfony 朋友相处一段时间后,我发现在注册新用户时(因此在公共防火墙中),loginAsUser(参见上面列表中的最后一个要点)考虑到这个防火墙进行令牌切换。更改公共防火墙名称时,它确实会更改$currentToken->keyand $token->providerKey。我认为这与一个误解有关:我们无法在属于另一个防火墙的页面上登录防火墙。那正确吗 ?

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

这是我的代码:

作曲家.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' );

如果您需要更多信息,请告诉我。

我知道我应该将权限管理到 a$app['security.access_rules']中,这是接下来的改进之一。虽然它不应该导致这个问题。

谢谢你的帮助 !

4

1 回答 1

1

我评论line 114UserController.phpfrom SimpleUser。IMO,我们不应该尝试将用户登录到公共页面:symfony/silex 属性是一个链接到公共防火墙的令牌,因此拒绝任何对安全页面的访问。

现在一切正常,感谢您的帮助!

于 2016-07-05T15:49:03.147 回答