使用 Symfony2,我实现了 AJAX 操作来管理应用程序中的一些书签(添加/删除)。因此,用户需要经过身份验证才能继续。
我有一个将用户重定向到登录页面的解决方案,但我认为最好使用事件来处理此重定向。
实际解决方案:
检查用户身份验证的方式与 FOSUserBundle 中的方式相同。
路由:
fbn_guide_manage_bookmark:
path: /bookmark/manage
defaults: { _controller: FBNGuideBundle:Guide:managebookmark }
options:
expose: true
requirements:
_method: POST
控制器 :
public function manageBookmarkAction(Request $request)
{
if ($request->isXmlHttpRequest()) {
$user = $this->getUser();
if (!is_object($user) || !$user instanceof UserInterface) {
return new JsonResponse(array('status' => 'login'));
}
// DO THE STUFF
}
}
jQuery :
$(function() {
$('#bookmark').click(function() {
$.ajax({
type: 'POST',
url: Routing.generate('fbn_guide_manage_bookmark'),
data : xxxx, // SOME DATA
success: function(data) {
if (data.status == 'login') {
var redirect = Routing.generate('fos_user_security_login');
window.location.replace(redirect);
} else {
// DO THE STUFF
}
},
});
});
});
其他解决方案? :
为了不在控制器级别验证用户是否已通过身份验证,我将在安全配置文件中保护我的路由:
安全 :
security:
access_control:
- { path: ^/(fr|en)/bookmark/manage, role: ROLE_USER }
控制器 :
public function manageBookmarkAction(Request $request)
{
if ($request->isXmlHttpRequest()) {
$user = $this->getUser();
// THIS VERIFCATION SHOULD NOW BE REMOVED
/*
if (!is_object($user) || !$user instanceof UserInterface) {
return new JsonResponse(array('status' => 'login'));
}
*/
// DO THE STUFF
}
}
基本上,当尝试这个解决方案时,Symfony2 会在内部重定向大量登录页面,正如您在 Firebug 中看到的那样:
所以我的问题是:
- Symfony2 在重定向之前是否抛出事件或异常?例如,这将允许使用侦听器来捕获事件并设置 JSON 响应?
- 在这种情况下,应该准备什么样的应对措施呢?就像我的第一个使用 HTTP 标头代码(如 302(或其他代码))的解决方案。如何在 AJAX 级别处理这个问题?
我可以看到一些基于异常事件的解决方案,但我认为有必要在控制器级别引发异常,这是我想避免的。这是一个例子:
https://github.com/winzou/AssoManager/blob/master/src/Asso/AMBundle/Listener/AjaxAuthenticationListener.php