我是backbone.js的新手。我正在使用“backbone-on-rails”gem开发rails应用程序。我已经包含了3个模型和渲染视图uisng骨干。它工作正常。现在我想使用设计为我的应用添加身份验证,用户登录后只需要我的应用程序需要呈现,否则我需要重定向到登录页面。
我为它添加了devise
gem。
有人可以帮助我如何检查用户是否已登录,如果用户尚未登录需要重定向到使用骨干设计sign_in页面?
先谢谢
答案 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?
布尔值。