如何在SproutCore应用程序中处理经过身份验证的状态

时间:2015-05-12 09:48:12

标签: sproutcore sproutcore-controllers

but there are better ways anyhow的(现在有点删除的)问题中,他想知道在何处以及如何设置计时器来检查用户的身份验证。

他的问题是一个更大问题的一部分(这个问题的标题)。因为我认为回答这个问题很重要,所以我创建了一个新问题,作为在一个地方收集所有重要信息的一种方式。

1 个答案:

答案 0 :(得分:1)

这是使用状态图的典型案例,更具体地说是并发状态。

如果您还不知道,SproutCore包含一个非常有用的库,名为SC.Statechart,这是一种以比使用布尔属性更可控的方式处理应用程序状态的方法,如它也像响应者和控制者一样。

在这种情况下,您需要一个状态图,它在根目录中有两个并发状态:一个用于处理身份验证状态,另一个用于处理应用程序的其余部分。

MyApp.statechart = SC.Statechart.create({
  rootState: SC.State.design({
    substatesAreConcurrent: true,
    AUTH: SC.State.design({
      initialSubstate: 'CHECKAUTH',
      CHECKAUTH: SC.State.design({
      }),
      LOGIN: SC.State.design({
      }),
      AUTHENTICATING: SC.State.design({
      }),
      AUTHENTICATED: SC.State.design({
      }),      
    }),
    APPMAIN: SC.State.design({
    })
  })
});

这应该是怎么回事: 当您的应用程序启动时,它将同时进入两个状态,一个是APPMAIN状态,即处理应用程序本身的状态。另一个是AUTH状态,它将立即转到初始子状态CHECKAUTH,它检查用户是否具有有效会话。如果不是,则该状态应该进入LOGIN状态,该状态负责显示登录屏幕。当用户然后执行登录时,LOGIN状态转换为AUTHENTICATING状态,进行服务器检查。如果此尝试无效或不正确,则AUTHENTICATING状态应转换为LOGIN,否则转换为AUTHENTICATED。

要回答原始问题,这个问题基于:如果您需要定时检查身份验证是否仍然有效的某个计时器,它应该处于AUTHENTICATED状态。如果失败,您可以立即转换到LOGIN状态,以显示登录屏幕。

使用这样的状态图可以防止用户重新加载或退出应用程序以便再次登录,并可能导致数据丢失。简而言之,它可以提供更好的用户体验。