Как я могу запретить пользователям доступ к частям моего приложения Backbone, если они не вошли в систему?

Итак, у меня есть приложение Backbone + домашняя страница. Прямо сейчас, если вы входите на мой сайт, я создаю глобальный объект с вашими данными о пользователе из базы данных. Однако вы можете просто нажать один из маршрутов в приложении напрямую.

Как обращаться с пользователями, которые не «вошли в систему», и перенаправить их на страницу «вы должны войти»?

Это стандартная операция? В принципе, у меня есть настройка URL REST, которая возвращает только

{ sessionId: [php-session-id-here] }

Если они войдут в систему, он вернет нечто подобное:

 { sessionId: [php-sess-id], userId: [user-id-from-db], firstName: [f-name], lastName: [l-name] } 

Идеи? Благодаря!

То, что я делал в прошлом, – это включить на каждую страницу вместе с jQuery (фактически, добавленный в файл jQuery) расширение для метода AJAX для проверки того, какой пользовательский код отправляется, когда пользователь не вошел в систему. Когда это значение было замечено, оно перенаправляло пользователя на страницу входа, независимо от того, что происходит.

Это связано с тем, что на этом сайте было время при входе в систему, поэтому пользователь мог выйти из системы, сидя на странице, а затем запрос AJAX просто потерпел неудачу. Если у вас нет тайм-аута при входе в систему, вероятность когда-либо увидеть эту проблему тонкая. Просто игнорируйте запросы, которые поступают от пользователей, которые не вошли в систему.

Если вам нужна помощь в кодировании, начните здесь: Расширение Ajax: Prefilters, Converters и Transports .


На самом деле не должно требовать ничего сложного, как псевдокод:

  1. JS необходимо сделать некоторые AJAX, поэтому JS разговаривает с сервером
  2. PHP проверяет наличие логина
  3. Если вы не вошли в систему, отправьте сообщение об ошибке (я использовал конвертер, чтобы поймать «notLoggedIn» dataType. Однако это также можно сделать с транспортом, они просто сложнее).
  4. JS видит сообщение о прерывании и перенаправляет window.location, а не возвращает сообщение AJAX.

Если вы хотите, вы можете загрузить лайтбокс с формой входа и отправить его через AJAX на PHP, где может произойти повторный вход, если вы помните, что попытка AJAX оказалась неудачной, вы можете отправить ее снова после входа в систему. Тогда пользователю даже не нужно оставлять страницу для входа в систему.

Если вы используете jQuery, вы можете установить глобальную ajaxSetting которая позволяет вам делать определенные вещи по определенным http-кодам. Некоторые страницы, которые я читаю, рекомендуют добавить в свой JSON поле url, чтобы указать, где войти, но я полагаю, что это зависит только от вас. Итак, единственные изменения, которые вам нужно реализовать, я упомянул: 1. измените http-код на что-то разумное, как 401 (неавторизованное), и реализуйте обработчик http-кода. Но я бы не назвал этот стандарт, я бы просто сказал, что это сделали несколько человек (включая меня).

 <?php function IsLoggedIn() { if(isset($_SESSION['id'])) // Change that to what you want { return 1; } else { return 0; } } ?> 

Затем в вашем коде вы можете использовать что-то вроде: if(isLogged()){ header('Location: http://google.com'); } if(isLogged()){ header('Location: http://google.com'); }