我正在尝试为我的Symfony2单页应用程序设置路由,但我不知道如何正确地进行,而不会让它感到超级黑客。
以下是我需要它做什么,以及我如何尝试设置它:
身份验证时
-
任何请求
application/json
的路由都应该像往常一样命中它们设置的路由。 -
任何输入的不请求
application/json
的路由都应该加载一个控制器,该控制器会呈现一个包含我的单页应用程序的所有JS的小树枝文件。 -
任何不存在并最终寻找符号路由的静态资源,例如[.js、.css、.jpeg等],都应该返回404。
未通过身份验证时
-
任何请求
application/json
的东西都应该返回403 -
任何未请求
application/json
的内容都应返回到登录页面
以下是我迄今为止所做的尝试:
-
使用FOSRestBundle为每个服务设置路由
-
如果请求不是
application/json
,则设置一个返回基本控制器html的侦听器if (!in_array('application/json', $request->getAcceptableContentTypes())) { $fakeRequest = $event->getRequest()->duplicate( null, null, array('_controller' => 'HvHDashboardBundle:Dashboard:index') ); $controller = $this->resolver->getController($fakeRequest); $event->setController($controller); }
-
如果静态资源不存在,则设置一组"catch-all"路由以伪造404。
# routing.yml # Catch any files that are meant to be their own static resource and return 404 catch_all_fail: pattern: /{uri}.{_format} defaults: { _controller: MyBundle:Dashboard:return404 } requirements: _format: js|hbs|css|jpg|gif|jpeg|png
问题
- 这种方法感觉像是一次大规模的黑客攻击,而不是Symfony路由系统的工作方式
- 即使您没有通过身份验证,也会返回基本控制器页,因为类型侦听器在安全上下文之前被命中并强制呈现该控制器
问题:
其他人如何通过使用Symfony的路由和单页应用程序来解决这个问题,他们最初需要用trick呈现HTML,然后JS接管并请求JSON?
只生成一个API,根本没有静态页面。相信我,我最近和Symfony做了一个中等规模的API,这就是我要做的。如果不将API与静态页面混合,它将大大简化后端安全性。当然,如果你想拥有某种登陆页之类的东西,你仍然可以拥有静态页面。但尽量不要将它们与主应用程序混合使用。
即使是登录,也不要创建静态页面,而是使用一个api路由来验证用户名/密码,并向用户返回auth令牌作为响应。例如,一个用户可以有多个令牌(可以在多个位置登录),每次都会在请求标头中发送令牌。
如果令牌验证正常,symfony将知道它属于哪个用户,因此您将知道"用户"。如果不存在令牌,它应该返回"未通过身份验证",如果令牌无效,也可以返回类似的内容或"错误请求"。
在使用API时,我必须做的一件事是,我必须编写一个请求侦听器来接受JSON内容并将其转换为请求对象,这样我就可以使用$request->request访问数据。
如果你有任何问题,请在评论中告诉我,我可以提供帮助。
就路由而言,遵循REST规则就可以了。