使用骨干进行设计验证

时间:2014-07-03 04:11:02

标签: javascript ruby-on-rails backbone.js devise

我是backbone.js的新手。我正在使用“backbone-on-rails”gem开发rails应用程序。我已经包含了3个模型和渲染视图uisng骨干。它工作正常。现在我想使用设计为我的应用添加身份验证,用户登录后只需要我的应用程序需要呈现,否则我需要重定向到登录页面。

我为它添加了devise gem。

有人可以帮助我如何检查用户是否已登录,如果用户尚未登录需要重定向到使用骨干设计sign_in页面?

先谢谢

2 个答案:

答案 0 :(得分:2)

Backbone是一个仅限前端的框架,因此它没有身份验证的概念。所有源代码都被发送到Web浏览器,并且所有网络连接都很明显,因此恶意用户可以欺骗您的应用程序认为它已登录,即使它不是。因此,您仍需要检查服务器上的访问权限。

但是,您可以做的是让您的Backbone应用程序检测它是否认为已登录,并根据该更改显示。例如,您可以使用Devise的user_signed_in?助手在您的body标签上添加数据属性,并将其挂钩。您的app/views/layouts/application.html.erb

中有类似的内容
<body data-user-signed-in="<%= user_signed_in? ? "true" : "false" %>">

然后,也许你的Backbone路由器会看起来像这样:

myApp.Routers.Router = Backbone.Router.extend({
    routes: {"": "showFrontPage"}, 
    isSignedIn: function() { 
        return $('body').data('user-signed-in') === "true";
    }, 
    showFrontPage: function() {
        var view;  
        if (this.isSignedIn()) { 
            view = new myApp.Views.MainAppView();
        } else { 
            view = new myApp.Views.SignInView();
        }
        view.render();
    }
});

或者,您可以直接查看会话cookie。不过,这对我来说似乎有点脆弱;如果您的应用程序名称发生更改,或者Rails更改了其命名Cookie的方式,那么您的应用程序将会中断。但在这种情况下,您的isSignedIn()函数看起来会更像这样:

isSignedIn: function() { 
    return document.cookie.indexOf("_Railsappname_session") > -1;
}

如果要在应用的各个位置检查用户,可以轻松编写一个控制器方法,将user_signed_in?的结果作为JSON对象返回。但最好不要依赖于此;而不是调用/user/is_signed_in然后调用/posts/create,更好的是对/posts/create进行一次调用,并且如果用户未登录则返回401 Unauthorized。


至于登录本身,您可以通过JS使Devise适应工作,这样您就可以通过AJAX登录,但它并不像您希望的那样简单。有tutorial here

答案 1 :(得分:0)

我需要使用devise在rails中实现骨干登录。请注意,出于我的目的,我也不需要用户注册,因为我想只有一个管理员用户,由我在终端中手动创建。

基本上只要您向正确的设计路线发出AJAX发布请求,设计就会为您处理登录(假设您当然正确地完成了设计设置过程)。 在Backbone中,您可以使用新模型保存来发布此帖子请求。

This tutorial帮助我设置了我的Backbone模型和视图(仅供参考:本教程还介绍了为了添加注册功能而需要做的事情)。 本教程有一些更先进的骨干设置(例如它使用backbone.marionette和backbone.modelbinder)虽然非常有用,但我不想进入。下面是我的教程的简化版本,以及您需要的核心内容。

创建一个与您的设计登录路径匹配的urlRoot模型。对于大多数使用标准用户模型的人来说,下面的urlRoot路由应该有效。请注意,我的代码是用coffeescript

编写的
class MyCoolBackboneApp.Models.UserSession extends Backbone.Model
  urlRoot: '/users/sign_in.json'
  defaults:
    email: ""
    password: ""    

  toJSON: ->
    { user: _.clone(@attributes) }

请注意,设计期望将参数包含在“用户”中,这就是为什么我们必须覆盖toJSON方法

然后在您看来,您需要做的就是将模型与登录凭据一起保存。当然,每个人可能会有不同的成功和失败回调,但这是一个非常基本的实现:

events:
    'submit form': 'login'

initialize: =>
    @model = new MyCoolBackboneApp.Models.UserSession()

render: =>
    $(@el).html( @template() )
    @

credentials: ->
  {
    email: @$('#email').val(),
    password: @$('#password').val(),
    remember_me: 1
  }

login: (event)->
  event.preventDefault()
  @model.save(@credentials(),
    success: (userSession, response) =>
      window.location.href = "/"
    error: (userSession, response) =>
      message = $.parseJSON(response.responseText).error
      alert(message)
)

您还应该阅读有关如何设置设计ajax身份验证的this tutorial

完成上述教程后,您应该能够使用正确的凭据保存UserSession模型(就像在视图中一样)并成功登录(假设您的数据库中已保存现有用户) 。当您被重定向到成功回调时,您就会知道您已成功登录。

然后在应用程序其余部分的控制器中,您应该能够使用设计助手:user_signed_in?current_user等等。

(如果您已登录但为这些帮助程序获取未定义的方法错误,请尝试向控制器添加:include Devise::Controllers::Helpers

最后,Alex P的回复可以指导您如何在Backbone视图中使用user_signed_in?布尔值。