如何让一个刚刚注册的 SimpleUser 登录到 Silex/Symfony 的安全区域?
How make a just registered SimpleUser log in secured area in Silex/Symfony with?
我正在寻求有关使用 SimpleUser for Silex 的帮助。
我的 composer.json 在需要的时候可用。
在 SimpleUser 中,我们可以访问一个页面以允许用户自行注册(并可能确认他们的电子邮件)。当不确认电子邮件时,这些用户会在完成注册表后自动登录(通过 RegisterAction
行 89
,调用 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)"} []
这里的重点是登录页面知道用户,因为它显示姓名、电子邮件等。所以用户肯定已登录。
总结一下,我的问题是第四步:
- 以匿名方式访问页面,
- 正在重定向到登录页面,
- 注册成为用户,
- 尝试访问(手动或使用 link)任何页面重定向到 root(预期)和 root 重定向到登录表单(不预期),
- 在登录页面看到您已登录。
我的思考,经过几个小时的挖掘代码,发现了两个有趣的点:
- 抛出的异常是合法的:实际上没有token_storage。按照构造函数,我发现它应该在注册我的
SecurityServiceProvider
行 314
时被填充。从这里我猜我的防火墙设置有误...
- 我尝试调试并观察
$app['security.token_storage']
中的内容,但每当我访问具有完全正常工作的注册用户或新注册用户的页面时,它都是空的。
- 我查看了
loginAsUser
函数,发现有些奇怪。令牌从当前值更改为用于对用户进行身份验证的新令牌。值 authenticated
、user
和 key
从 true
、"anon."
和 "public"
更改为 false
,实例SimpleUser\User
和 "public"
(属性 从 key
更改为 providerKey
)。会不会是从这里来的?
编辑 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']
,这是接下来的改进之一。它不应该导致这个问题。
感谢您的帮助!
我评论了 SimpleUser
的 UserController.php
的 line 114
。
IMO,我们不应该尝试在 public 页面中登录用户:symfony/silex 属性链接到 public 防火墙的令牌,因此拒绝任何对安全页面的访问。
现在一切正常,感谢您的帮助!
我正在寻求有关使用 SimpleUser for Silex 的帮助。 我的 composer.json 在需要的时候可用。
在 SimpleUser 中,我们可以访问一个页面以允许用户自行注册(并可能确认他们的电子邮件)。当不确认电子邮件时,这些用户会在完成注册表后自动登录(通过 RegisterAction
行 89
,调用 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)"} []
这里的重点是登录页面知道用户,因为它显示姓名、电子邮件等。所以用户肯定已登录。
总结一下,我的问题是第四步:
- 以匿名方式访问页面,
- 正在重定向到登录页面,
- 注册成为用户,
- 尝试访问(手动或使用 link)任何页面重定向到 root(预期)和 root 重定向到登录表单(不预期),
- 在登录页面看到您已登录。
我的思考,经过几个小时的挖掘代码,发现了两个有趣的点:
- 抛出的异常是合法的:实际上没有token_storage。按照构造函数,我发现它应该在注册我的
SecurityServiceProvider
行314
时被填充。从这里我猜我的防火墙设置有误... - 我尝试调试并观察
$app['security.token_storage']
中的内容,但每当我访问具有完全正常工作的注册用户或新注册用户的页面时,它都是空的。 - 我查看了
loginAsUser
函数,发现有些奇怪。令牌从当前值更改为用于对用户进行身份验证的新令牌。值authenticated
、user
和key
从true
、"anon."
和"public"
更改为false
,实例SimpleUser\User
和"public"
(属性 从key
更改为providerKey
)。会不会是从这里来的?
编辑 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']
,这是接下来的改进之一。它不应该导致这个问题。
感谢您的帮助!
我评论了 SimpleUser
的 UserController.php
的 line 114
。
IMO,我们不应该尝试在 public 页面中登录用户:symfony/silex 属性链接到 public 防火墙的令牌,因此拒绝任何对安全页面的访问。
现在一切正常,感谢您的帮助!