我正在寻求使用 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)"} []
这里的重点是登录页面知道用户,因为它显示姓名、电子邮件等。所以用户肯定是登录的。
总而言之,我的问题是第四步:
- 以匿名身份访问页面,
- 重定向到登录页面,
- 注册为用户,
- 尝试访问(手动或使用链接)到任何页面重定向到 root(这是预期的)和 root 重定向到登录表单(不是预期的),
- 看到您已登录登录页面。
我的想法,经过几个小时的挖掘代码,发现了两个有趣的点:
- 抛出的异常是合法的:实际上没有 token_storage。在构造函数之后,我发现它应该在注册 my
SecurityServiceProvider, line时被填充314。从这里我想我的防火墙设置错误...... $app['security.token_storage']每当我使用完全正常工作和注册的用户或新注册的用户访问页面时,我都尝试调试并观察.- 我查看了
loginAsUser函数,发现有些奇怪。令牌从当前值更改为用于对用户进行身份验证的新令牌。、 和的值从authenticated、user和key更改为、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']中,这是接下来的改进之一。虽然它不应该导致这个问题。
谢谢你的帮助 !