Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法确保请求来自受信任的UI应用程序?_Java_Spring Boot_Ember.js_User Permissions - Fatal编程技术网

Java 有没有办法确保请求来自受信任的UI应用程序?

Java 有没有办法确保请求来自受信任的UI应用程序?,java,spring-boot,ember.js,user-permissions,Java,Spring Boot,Ember.js,User Permissions,因此,为了给您一个背景,我们有一个后端应用程序,它有大量的API(SpringBootFramework)。还有一个UI应用程序,它混合了React和Ember.js。我们正在使用OAuth2.0访问令牌 UI的每个页面都可能使用大量API资源,页面的权限(包括操作和按钮)与直接访问API的权限是分开管理的 现在的问题是为了阻止任何拥有访问令牌的人直接调用任何API。为了阻止这种情况,我们决定将每个页面中使用的服务/资源或按钮链接到路由url(Ember.js routes),以便根据用户对这些

因此,为了给您一个背景,我们有一个后端应用程序,它有大量的API(SpringBootFramework)。还有一个UI应用程序,它混合了React和Ember.js。我们正在使用OAuth2.0访问令牌

UI的每个页面都可能使用大量API资源,页面的权限(包括操作和按钮)与直接访问API的权限是分开管理的

现在的问题是为了阻止任何拥有访问令牌的人直接调用任何API。为了阻止这种情况,我们决定将每个页面中使用的服务/资源或按钮链接到路由url(Ember.js routes),以便根据用户对这些路由的权限,确定它们是否可以访问后端的特定服务。换句话说,如果用户直接向服务发送请求,并说服务链接到了UI世界中他无权访问的页面,则安全检查会阻止他

然而,这正成为一个令人头痛的问题。页面不断变化,一些服务被删除或添加新服务,我们必须不断维护SQL脚本以保持两者之间的链接。现在要提到的是,由于UI(路由)的层次结构,这变得更加复杂

现在我想知道,如果我们能确定一个请求来自一个UI,那么我们就不需要检查API的权限,如果他们没有访问权限,UI就不会被呈现,那么我们可以安全地让请求进入并得到服务。如果同一个用户使用他的UI令牌直接访问API,我们只需阻止它。如果用户需要直接访问API,那么他们必须获得用于API的特殊令牌(一些用户可能需要直接使用API进行访问)

现在的问题是,我们如何确定请求来自UI,并且UI页面是我们信任的页面?我在互联网上搜索过,但找不到任何框架或协议。有可能吗

我们如何确定请求来自UI,并且该UI页面是我们信任的页面

你可能不能。要做到这一点,您需要一个可信的执行环境,换句话说,一个用户不能完全控制的环境。这方面的例子包括信用卡销售点机器、有线/卫星电视盒和ARM TrustZone。这些环境允许您在客户端设备上存储用户看不到的秘密。然后,您可以使用此秘密在受信任的环境中与代码通信,而用户无权访问它

但是,用户的web浏览器不是受信任的执行环境。用户可以在您的网页上看到所有cookie、本地和会话存储等,他们可以使用它们通过类似curl的方式直接发出请求,从而使请求看起来与来自浏览器的请求相同

这不是问题,但你该怎么办?
考虑到您现在的设置方式,这听起来可能是一件痛苦的事情,但是请在API上执行所有的安全和许可。如果您不希望用户使用他们的令牌自动调用API,那么对令牌实施速率限制。

重新审视一下您最初使用此设置的原因也可能很有用。用户是否直接调用API来重载服务器?用户体验关注的是用户在页面上看到的内容吗?关于用户可以访问哪些数据和操作,这是一个访问问题吗?

如果我完全错过了,很抱歉,但这不是一个简单的跨源资源共享(CORS)案例吗

您可以将每个控制器上允许的COR设置为UI/前端域的COR

@CrossOrigin(value = "example.com")
@RestController
public class PrivateController {

}

控制器现在将拒绝任何不是来自
example.com

的内容。您可以使用或类似的方法来执行此操作。当用户请求UI时,如果他们获得授权,您可以向他们发送一次性使用令牌/nonce。此令牌的有效期为X分钟或一次使用。对服务器的下一个请求必须包含此nonce,并且在响应中,您将为它们提供一个新的nonce。如果有任何请求没有临时通知或过期,您将拒绝该请求。谢谢,但这有什么帮助?如果我从UI获得一个nonce,然后使用它直接向API服务发送请求,我可以用它做任何事情,然后再次获得一个新的nonce?或者我在这里遗漏了什么?不,真的没有。一旦你把信息交给客户端处理,你就再也不能信任它了——可能有人在摆弄一个有根的Android设备,或者在浏览器的情况下,可以轻松打开控制台开始编辑东西。你的服务器必须自己执行所有策略。我认为这没有帮助。我们不会有多个域。它总是一个领域。此外,这可能会阻止用户直接访问API。我们不想那样。我们基本上希望管理与API权限分离的UI权限,并停止UI访问令牌以直接访问API,尽管给出了迄今为止的答案,我确信这是不可能的。很想知道其他网站做什么,以及它们如何保护自己的APIOK,这更有意义。。。我每天都用Springboot和Ember构建微服务,听起来你可能需要将你的API层分离到它自己的服务中,并使用Zuul之类的东西来阻止UI请求流向API服务。它们是分开的。我们有微服务,API网关等。这是一个不小的应用程序。这就是为什么管理所有这些权限成为一个痛苦的检查Zuul。似乎对我描述的问题没有帮助。不管怎样,谢谢你。你知道网站通常是如何在保护API的同时允许访问网页的吗?他们不知道。它们保护API。关于安全性的主要问题是用户可以读取或写入哪些数据。从这一点可以确定用户可以看到哪个UI。不是相反的方向。@Lux ok s