我正在建立一个Dart / Aqueduct webapp,我需要能够限制对某些路线的访问。我正在使用Aqueducts Authorizers来处理HTTP请求,但我有点担心在dart应用程序中控制用户访问。
当路由到webapp中的不同页面时,我使用Dart路由,即:
const Route(path: '/heroes', name: 'Heroes', component: HeroesComponent)
这允许我在新URL上使用不同的模板和组件,但是没有发出HTTP请求。一旦用户在应用程序中,有没有办法有效地实现用户范围?
我正在考虑在路由组件初始化时检查访问令牌,如果用户未经过身份验证则不显示信息,但是由于dart webapps进入,因此用户仍然无法访问该页面内容预编译的JS包?
答案 0 :(得分:0)
考虑创建两个应用程序 - 一个基本上只包含登录/注册页面,另一个包含受保护的功能。
您需要在服务器上编写代码才能让经过身份验证的用户看到受保护的应用。否则,您可能想要抛出403,或将guest虚拟机重定向到登录页面。
希望这有帮助。
答案 1 :(得分:0)
如果我误解了你的问题,或者你已经了解了大部分内容,请原谅我,但听起来你问的是应用程序显示的数据与应用程序本身之间的区别。或者更一般地说,单个页面应用程序和服务器端呈现页面之间的区别。
在服务器端呈现应用程序中,每个导航都会从服务器(或缓存)加载新的URL。服务器使用来自请求的授权信息来获取适当的数据,将其插入到模板化的HTML页面中,然后返回该页面。根据客户端,页面显示的数据和页面本身是单个实体。如果无法获取数据,则返回不同的页面,指示用户无权访问。
在单页面应用程序中,您可以导航到的每个可能的“页面”都会下载一次,并且它们都没有任何实际数据。相反,这些页面是数据的容器。这些页面的行为向服务器发出API请求以显示数据。
应用程序本身不受保护 - 任何人都可以导航到它或其任何页面。但是,数据受到保护。如果用户无权访问API调用所请求的数据,则返回带有JSON错误正文的401状态代码。
因此,客户端和服务器端路由之间必须有区别。您已经注意到客户端路由实际上并未发出HTTP请求 - 这是故意的。
如果您从同一个应用程序提供应用程序和API,最好在所有API路径前加上/api
之类的内容。例如,客户端路由为/heroes
,服务器端路由为/api/heroes
。这也允许移动应用程序(或任何其他非浏览器应用程序)使用您的API;他们不会想要HTML,因为他们有自己的渲染行为。
正如Günter所说,如果有一个页面在没有API数据的情况下无用,请将它们放回登录页面。在两种情况下,您无权访问API数据:您根本没有访问令牌,并且您的访问令牌已过期。
导航到/heroes
客户端路由时发出API请求。如果您没有访问令牌,请将它们放到登录页面。如果请求产生401,则将它们返回到登录页面。如果你回到200,那么正常运作。
客户端路由阻碍的一个地方是尝试在浏览器中键入客户端路由URL(而不是以编程方式导航到它)。有不同的策略来支持这一点,这里有一个:https://github.com/stablekernel/aqueduct/issues/274。