我有一个Rails / Backbone应用程序,它使用JavaScript / Ajax(使用主干)实现Devise身份验证。用户登录后,我将userSession响应对象从devise分配给app.currentUser,以创建客户端currentUser。
app.currentUser = userSession;
然而,我使用currentUser的方式,我可能只是给它一个布尔值,因为我不使用任何userSession信息。
继续,在我的应用程序的其他方法中,我通过查看是否有这样的当前用户来检查授权
if(!app.currentUser) {
this.trigger("pleaseSignIn");
return;
}
else {
....
我测试它时工作正常 - 如果用户没有登录,他就无法继续应用的某些部分。但是,任何具有基本javascript技能的人都可以通过在控制台中设置app.currentUser = true
来绕过登录。我不是在我的授权背后保护国家机密;它只是为了鼓励注册等。
我的问题是,有没有办法在不检查服务器端是否存在当前用户的情况下加强这一点(即设备在登录时设置当前用户服务器)。
我考虑的一个(弱)策略是对我的变量使用完全无意义的名称。即而不是if(!app.currentUser) {
我可能会说if(!app.godNotDead)
,所以有人至少不得不通过废话来破解我的多孔身份验证墙。但是,我仍然希望能有一些更强大的东西。
也许我应该再解释一下应用程序的工作原理。它一开始没有身份验证墙。相反,用户可以玩应用程序的某些部分,只有当他们尝试点击他们被要求登录的应用程序的其他部分时。
仅供参考,在正常的设备设置中,在服务器上的Rails控制器中检查授权,并且不能以这种方式绕过授权。
答案 0 :(得分:0)
最好的方法是从rails而不是客户端获取状态
UserModel.fetch()
// returns a user model if there is one, if not then you are obviously not authenticated
或者,我认为更好,使用令牌作为您对服务器的请求的参数
?token={some hash the server gave you}
因此它不仅仅是一个布尔值,你需要一个标记