如何让一个刚刚注册的 SimpleUser 登录到 Silex/Symfony 的安全区域?

How make a just registered SimpleUser log in secured area in Silex/Symfony with?

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

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

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

实际做的是,在注册后,当我调用任何 url 时,我得到了一个 302 redirection 到根目录/页面(这是由我的控制器完成的,如果有权使用页面未被授予),然后我在登录 url 中收到另一个 302 redirection(已完成 "automatically")。我在日志中看到抛出异常:

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. 尝试访问(手动或使用 link)任何页面重定向到 root(预期)和 root 重定向到登录表单(不预期),
  5. 在登录页面看到您已登录。

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

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

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

这是我的代码:

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'],这是接下来的改进之一。它不应该导致这个问题。

感谢您的帮助!

我评论了 SimpleUserUserController.phpline 114。 IMO,我们不应该尝试在 public 页面中登录用户:symfony/silex 属性链接到 public 防火墙的令牌,因此拒绝任何对安全页面的访问。

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