#javascript #ruby-on-rails #backbone.js #devise
#javascript #ruby-on-rails #backbone.js #придумать #разработка
Вопрос:
Я новичок в backbone.js . Я разрабатываю приложение rails с использованием драгоценного камня «backbone-on-rails». Я включил 3 модели и представления рендеринга, используемые в backbone. Это сработало нормально. Теперь я хочу добавить аутентификацию в свое приложение с помощью devise, после того, как пользователь вошел в систему, должно отображаться только мое приложение, иначе мне нужно перенаправить на страницу входа.
Я добавил devise
для этого драгоценный камень.
Может кто-нибудь, пожалуйста, помочь мне в том, как я могу проверить, вошел пользователь в систему или нет, если пользователю не требуется перенаправление на страницу devise sign_in с использованием backbone?
Заранее спасибо
Комментарии:
1. У Devise есть метод,
authenticate_user!
поэтому вы можете использовать его как фильтр, что-то вродеbefore_filter :authenticate_user!, except: [:show, :index]
, но не знаете, как это сделать в backbone.js2. @Mandeep Спасибо, Mandeep, я использовал метод before_filter, и у меня это сработало, но я хочу использовать backbone для аутентификации пользователя, если это возможно.
3. не так много знаю о backbone.js , может помочь вам только с частью ROR 🙂
Ответ №1:
Backbone — это фреймворк только для интерфейса, поэтому в нем нет концепции аутентификации. Весь исходный код отправляется в веб-браузер, и все сетевые подключения хорошо видны, поэтому злоумышленник может обмануть ваше приложение, заставив его думать, что оно вошло в систему, даже если это не так. Таким образом, вам все равно нужно будет проверить права доступа на сервере.
Однако, что вы можете сделать, так это заставить ваше приложение Backbone определить, считает ли оно, что оно вошло в систему, и изменить его отображение на основе этого. Например, вы могли бы использовать user_signed_in?
помощник Devise для добавления атрибута данных в свой тег body и подключения к нему. Что-то вроде этого в вашем app/views/layouts/application.html.erb
:
<body data-user-signed-in="<%= user_signed_in? ? "true" : "false" %>">
И тогда, возможно, ваш магистральный маршрутизатор будет выглядеть примерно так:
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 несанкционированный, если пользователь не вошел в систему.
Что касается входа в систему как таковой, вы можете адаптировать Devise для работы через JS, чтобы вы могли входить в систему через AJAX, но это не так просто, как вы могли бы надеяться. Здесь есть руководство.
Комментарии:
1. Нужно ли мне писать другое представление в signinview или я могу использовать devise view здесь. если да, не могли бы вы, пожалуйста, рассказать мне, как это возможно
2. Представления Backbone сильно отличаются от представлений Rails. В моем примере продемонстрировано использование двух базовых представлений; вам вообще не обязательно делать это таким образом. Вы можете сохранить свой логин, используя стандартные представления Rails, если хотите; возможно, в этом случае вы будете проверять наличие зарегистрированного пользователя и запускать свое приложение Backbone только в том случае, если пользователь вошел в систему.
3. Да, мне понравилось только это, но есть ли какая-либо возможность получить rails views из backbone извините, если мой вопрос тупой.
4. Они оба могут называться «представлениями», но это очень разные вещи. Представления Backbone — это код JavaScript, который можно отображать; представления Rails — это шаблоны. Вы можете прочитать документацию по Backbone Views , чтобы узнать больше. Вы можете использовать любой HTML, который вам нравится, в своих представлениях, чтобы они могли работать с вашими представлениями Rails, но это не простая операция перехода.
5. Это руководство по разработке AJAX было намного проще и понятнее для понимания, чем то, которое упоминается в конце комментария Алекса П.
Ответ №2:
Мне нужно было реализовать вход в систему backbone в rails с помощью devise. Обратите внимание, что для моих целей мне также не требовалась регистрация пользователя, поскольку я хотел иметь только одного пользователя-администратора, созданного мной вручную в терминале.
В принципе, пока вы отправляете запрос AJAX post на правильный маршрут devise, devise будет обрабатывать вход для вас (при условии, конечно, что вы правильно выполнили процесс настройки devise). В Backbone вы можете выполнить этот post-запрос, используя сохранение новой модели.
Это руководство помогло мне настроить мою модель Backbone и представление (К вашему сведению: в руководстве также рассказывается о том, что вам нужно сделать, чтобы добавить функциональность регистрации). В руководстве были более продвинутые настройки backbone (например, он использует backbone.marionette и backbone.modelbinder), которые, хотя и очень полезны, я не хотел вдаваться в подробности. Ниже приведена моя упрощенная версия руководства по самой сути того, что вам нужно.
Создайте модель с urlRoot
, которая соответствует вашему маршруту входа в devise. Для большинства пользователей, использующих стандартную пользовательскую модель, должен работать urlRoot
приведенный ниже маршрут. Обратите внимание, что мой код написан на coffeescript
class MyCoolBackboneApp.Models.UserSession extends Backbone.Model
urlRoot: '/users/sign_in.json'
defaults:
email: ""
password: ""
toJSON: ->
{ user: _.clone(@attributes) }
Обратите внимание, что devise ожидает, что параметры будут заключены в ‘user’, поэтому нам пришлось перезаписать 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)
)
Вам также следует прочитать это руководство о том, как настроить аутентификацию devise ajax.
После завершения приведенного выше руководства вы сможете сохранить свою UserSession
модель с правильными учетными данными (как я делаю в представлении) и успешно войти в систему (при условии, что у вас есть сохраненный существующий пользователь в вашей базе данных).). Вы узнаете, что успешно вошли в систему, когда вас перенаправят на ваш успешный обратный вызов.
Затем в контроллерах в остальной части вашего приложения вы должны иметь возможность использовать помощников devise: user_signed_in?
or current_user
и т.д. И т.п.
(Если вы вошли в систему, но получаете ошибку неопределенного метода для этих помощников, попробуйте добавить: include Devise::Controllers::Helpers
в свои контроллеры).
Наконец, ответ Алекса П. может затем показать вам, как использовать user_signed_in?
логическое значение в ваших представлениях Backbone.