更新:就像@DustMason 在他的回答中所说,查看令人敬畏的embercasts以获取身份验证最佳实践。
为了将视图(Ember 应用程序)与服务器(Rails 应用程序)完全分开,我想使用令牌身份验证。我可能会在 Rails 服务器上使用 Devise。
说得通。
我需要在 Ember 应用程序中使用类似 before_filter 的东西,我可以在其中检查是否存在当前用户以及该用户是否设置了身份验证令牌。
你可以在路由上添加一个enter
钩子,这大致相当于一个 before_filter。但不确定这是检查身份验证令牌的最佳位置。
Rails 服务器将在每次调用时返回当前的身份验证令牌。
说得通。我们使用 cookie-auth 并通过调用获取当前用户配置文件,/api/me
但两者都应该工作。
如果它返回一个空的身份验证令牌,Ember 应用程序应该检测到这一点并转换到未经身份验证的状态,重定向到登录视图。
关于这种方法的事情是(与 rails 不同)“保护”对特定 ember 路线的访问并不容易。并且无论用户总是可以弹出打开的 JS 控制台并进入他们想要的任何状态。因此,与其认为“用户只有通过身份验证才能进入这种状态”,不如考虑“如果未经身份验证的用户以某种方式导航到这条路线怎么办”
我怀疑我应该为此使用 Ember 状态机,但我不确定如何继续。有人解决过这个问题吗?
我们的身份验证需求非常简单,因此我们还没有发现需要状态机。相反,我们isAuthenticated
在 ApplicationController 上有一个属性。当用户未通过身份验证时,我们使用此属性application.hbs
将主视图替换为登录表单。
{{if isAuthenticated}}
{{render "topnav"}}
{{outlet}}
{{else}}
{{render "login"}}
{{/if}}
从 ApplicationRoute,我们获取用户配置文件:
App.ApplicationRoute = Ember.Route.extend({
model: function() {
var profiles;
profiles = App.Profile.find({ alias: 'me' });
profiles.on("didLoad", function() {
return profiles.resolve(profiles.get("firstObject"));
});
return profiles;
}
});
然后我们的 ApplicationController 根据返回的配置文件计算它的 isAuthenticated 属性。