【问题标题】:Authentication with devise rails using backbone使用主干通过设计导轨进行身份验证
【发布时间】:2014-07-03 04:11:01
【问题描述】:

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

我已经为它添加了devise gem。

有人可以帮我看看如何检查用户是否登录,如果用户没有登录需要重定向到使用主干设计登录页面?

提前致谢

【问题讨论】:

  • Devise 有一个 authenticate_user! 方法,因此您可以将其用作过滤器,例如 before_filter :authenticate_user!, except: [:show, :index] 但不知道如何在bone.js 中执行此操作
  • @Mandeep 感谢 Mandeep,我使用了 before_filter 方法,它对我有用,但如果可能的话,我想使用骨干网对用户进行身份验证。
  • 对backbone.js不太了解,只能帮助你ROR部分:)

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


【解决方案1】:

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

不过,您可以做的是让 Backbone 应用检测它是否认为自己已登录,并据此更改其显示。例如,您可以使用 Devise 的 user_signed_in? 助手在您的身体标签上添加一个数据属性,然后挂钩。在你的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。


至于登录本身,您可以将 Devise 调整为通过 JS 工作,这样您就可以通过 AJAX 登录,但这并不像您希望的那么简单。有一个tutorial here

【讨论】:

  • 我需要在 signinview 中写不同的视图,否则我可以在这里使用设计视图。如果是的话,你能告诉我这是怎么可能的
  • Backbone 视图与 Rails 视图非常不同。我的示例演示了使用两个 Backbone 视图;你根本不必那样做。如果您愿意,可以使用标准 Rails 视图保持登录;也许在这种情况下,您将检查登录用户,并且仅在用户登录时启动您的 Backbone 应用程序。
  • 是的,我只是喜欢这样做,但是如果我的问题很生硬,是否有可能从主干获得 Rails 视图。
  • 它们可能都被称为“视图”,但它们是非常不同的东西。主干视图是可以呈现的 JavaScript 代码; Rails 视图是模板。您可以阅读Backbone Views documentation 了解更多信息。您可以在视图中使用您喜欢的任何 HTML,这样它们就可以与 Rails 视图一起使用,但这不是一个简单的插入式操作。
  • 这个devise AJAX tutorial 比 Alex P 评论末尾提到的更简单直接。
【解决方案2】:

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

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

This tutorial 帮助我设置了我的 Backbone 模型和视图(仅供参考:本教程还介绍了添加注册功能所需的操作)。 本教程有一些更高级的主干设置(例如它使用主干.marionette 和主干.modelbinder),虽然非常有用,但我不想进入。下面是我对您所需要的核心的教程的简化版本。

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

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

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

请注意,devise 期望将参数包装在“用户”中,这就是我们必须覆盖 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)
)

您还应该阅读this tutorial,了解如何设置设计 ajax 身份验证。

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

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

(如果您已登录但这些帮助程序出现未定义的方法错误,请尝试将:include Devise::Controllers::Helpers 添加到您的控制器)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    相关资源
    最近更新 更多