我正在寻求使用SimpleUser for Silex的帮助。 我的composer.json在需要的时候可用。
在SimpleUser中,我们可以访问页面以允许用户自己注册(并可能确认他们的电子邮件)。如果没有确认电子邮件,这些用户会在完成注册表单后自动登录(通过RegisterAction
行89
,loginAsUser
在线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)"} []
这里的要点是登录页面知道用户,因为它显示了名称,电子邮件等。因此用户肯定已登录。
总结一下,我的问题是第四步:
经过几个小时的挖掘代码后,我的想法发现了两个有趣的观点:
SecurityServiceProvider
行314
时应该填充它。从这里我猜我的防火墙设置错误了...... $app['security.token_storage']
内部的内容,只要我使用完全正常工作且注册的用户或新注册的用户访问页面,它就为空。loginAsUser
函数,发现一些奇怪的东西。令牌从当前值更改为用于对用户进行身份验证的新令牌。值authenticated
,user
和key
已从true
,"anon."
和"public"
更改为false
, SimpleUser\\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']
,这是下一个改进之一。但它不应该导致这个问题。
感谢您的帮助!
答案 0 :(得分:1)
我对来自line 114
的{{1}} UserController.php
进行了评论。
IMO,我们不应该尝试在公共页面中记录用户:symfony / silex属性链接到公共防火墙的令牌,因此拒绝任何对安全页面的访问。
现在一切都很好,谢谢你的帮助!