我正在 Symfony2 中构建自己的用户管理系统(不使用 FOSUserBundle),并希望能够强制用户更改密码。
我已经设置了一个 EventListener 来监听kernal.request
事件,然后我在监听器中执行一些逻辑来确定用户是否需要更改他们的密码;如果他们这样做,那么他们将被重定向到“更改密码”路线。
我将服务添加到我config.yml
的监听kernal.request
:
password_change_listener:
class: Acme\AdminBundle\EventListener\PasswordChangeListener
arguments: [ @service_container ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onMustChangepasswordEvent }
然后是听众:
public function onMustChangepasswordEvent(GetResponseEvent $event) {
$securityContext = $this->container->get('security.context');
// if not logged in, no need to change password
if ( !$securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED') )
return;
// If already on the change_password page, no need to change password
$changePasswordRoute = 'change_password';
$_route = $event->getRequest()->get('_route');
if ($changePasswordRoute == $_route)
return;
// Check the user object to see if user needs to change password
$user = $this->getUser();
if (!$user->getMustChangePassword())
return;
// If still here, redirect to the change password page
$url = $this->container->get('router')->generate($changePasswordRoute);
$response = new RedirectResponse($url);
$event->setResponse($response);
}
我遇到的问题是在开发模式下,我的侦听器也在重定向分析器栏和资产请求事件。当我转储资产并清除缓存并以生产模式查看站点时,它可以工作。
有没有办法可以忽略来自资产/分析器栏/任何其他内部控制器的事件?还是将用户重定向到 change_password 页面的更好方法(不仅在登录成功时)?
疯狂地思考疯狂的黑客解决方案,但肯定有办法在 Symfony2 中优雅地处理这个问题?