3

首先,让我描述一下这个应用程序:我们正在开发一个基于 Web 的软件,它是某种定制的帮助台应用程序。它需要用户登录(我们使用FOSUserBundle)。登录后,用户被重定向到仪表板。从仪表板不再需要重新加载页面,前端是基于 Angularjs 构建的,用户可以在应用程序中的任何地方访问,而无需重新加载页面。您可以说是单页应用程序。

因此,呈现给用户的数据是从 rest api 获取的(我们使用FOSRestBundle)。这在这一点上工作得很好。

有某种困境。只有我们的员工才能访问此应用程序(目前)。因此,工作人员需要登录才能访问帮助台。通过angularjs推送到前端的数据是通过api调用的,所以刚刚登录的用户每次请求都需要重新认证,因为休息。

问题:由于后端运行在 symfony2 上,让我们在进行 api 调用时尝试获取当前登录用户的用户对象:

$this->get('security.context')->getToken()->getUser()

匿名返回。代表匿名,或

$this->getUser();

只返回null

因此,使用 rest api 时,经过身份验证的上下文似乎消失了。但是,当我直接调用一个动作而不休息时,我可以获得用户信息。

所以我们需要的是保护我们的 rest api 并在每次 api 调用时获取用户信息。我们不希望第三方人员访问我们的应用程序,只有员工。我不熟悉 OAuth,但用户将被重定向到第三方页面以允许/拒绝访问他的数据?这对我们来说不是一个选择。

根据该信息,您对如何保护 api 和传输用户数据以使 getUser 不返回 null 或 anon 有任何建议或想法。但实际登录的用户?

4

3 回答 3

3

还有另一种方法可以解决您的问题。

这是通过使用Certificates。您可以生成证书然后使用 Http 隧道(https明显利),服务器将要求提供证书(您必须为此配置 Apache,但这不是一个大挑战)。

有了这个,您必须CertificateManager在服务器端添加一个以确保证书有效并知道谁在调用服务(以便能够在每次请求时对用户进行身份验证),CertificateManager(或者您将调用它)可能必须在您的过滤器链中进行配置(如 Java 世界中已知的那样),等等

跳,帮助你,Abderrazak

于 2013-04-26T14:13:27.823 回答
1

REST 是无状态的,因此您必须在每个请求中发送某种身份验证/授权。您可以使用 HTTP BASIC AUTH 或 OAuth 之类的东西。

看看https://github.com/FriendsOfSymfony/FOSOAuthServerBundle

我正在以完全相同的架构构建我们的应用程序(带有 Symfony2 后端和 AngularJS 前端的 RESTful API。

于 2013-04-25T22:32:13.697 回答
0

另一种方法是复制 api 路由,这样你就有了 OAUTH 保护的 api 路由和 session 保护的 api 路由,它们都指向同一个控制器。该方法在这里解释:https ://stackoverflow.com/a/22964736/435026

于 2014-04-09T13:56:21.417 回答