2013-02-12 67 views
0

我有一个Rails/Backbone应用程序,它实现了使用JavaScript/Ajax的Devise身份验证(使用主干)。用户登录后,我将devic的userSession响应对象分配给app.currentUser以创建客户端currentUser。客户端当前用户

app.currentUser = userSession; 

不过,我使用currentUser的路上,我还不如干脆给它一个布尔值,因为我没有使用任何的那userSession信息。

移动的,在我的应用程序的其它方法,我通过看是否有像当前用户检查授权该

if(!app.currentUser) { 
     this.trigger("pleaseSignIn"); 
     return; 
    } 
    else { 
    .... 

当我测试它也能正常工作 - 如果用户没有登录,他无法继续到应用程序的某些部分。但是,任何具有基本javascript技能的人都可以通过在控制台中设置app.currentUser = true来绕过登录。我不保护我授权背后的国家秘密;它只是为了鼓励注册等。 我的问题是,是否有一种方法可以在不检查服务器端是否存在当前用户(即,设置当前用户服务器sideon登录)的情况下加强一点。

我考虑的一个(弱)策略是对我的变量使用完全无意义的名称。即而不是if(!app.currentUser) {我可能会说if(!app.godNotDead),这样有人至少必须通过废话来破解我的多孔认证墙。不过,我仍然希望有一些更强大的东西。

也许我应该多解释一下应用程序的工作原理。它在开始时没有认证墙。相反,用户可以使用应用程序的某些部分,只有当他们尝试点击应用程序的其他部分时,才会要求他们登录。

仅供参考,在正常的设计中,授权在服务器上的Rails控制器中进行检查,不能绕过这种方式。

回答

0

最好的办法是获得来自轨道的状态,而不是客户端

UserModel.fetch() 
// returns a user model if there is one, if not then you are obviously not authenticated 

或者,我认为更好的,使用令牌作为您的要求设置了一个param服务器

?token={some hash the server gave you} 

这样它不仅仅是一个布尔值,你需要一个令牌