Статьи

Создать камень расширения в Синатре

Сотрудник RubySource Даррен Джонс написал книгу о Sinatra в рамках последней серии статей о Jump Start . С этими книгами размером с новеллу разработчики, потраченные на время, могут быстро освоить новый язык или структуру всего за один уик-энд.

В этом отрывке Даррен объясняет, как создать расширение администратора в Синатре. Убери это, Даррен.

Создание админского расширения

В главе 4 мы использовали сеансы для создания обработчиков маршрутов, которые позволяли пользователям входить и выходить из приложения. Сейчас мы собираемся создать несколько полезных вспомогательных методов, которые защищают страницы и проверяют, вошел ли пользователь в систему или нет. Мы также собираемся зарегистрировать вспомогательные методы другим способом — как расширение Sinatra. Расширения находятся в отдельных файлах и включают вспомогательные методы, настройки и обработчики маршрутов. Чтобы использовать расширение, вам нужен файл в вашем приложении. Это делает их многоразовыми, и они также могут быть упакованы как драгоценный камень для распространения. Чтобы создать расширение, создайте новую папку в корневом каталоге с именем sinatra . Внутри этой папки создайте новый файл с именем auth.rb. Полный код этого расширения показан:

require 'sinatra/base' require 'sinatra/flash' module Sinatra module Auth module Helpers def authorized? session[:admin] end def protected! halt 401,slim(:unauthorized) unless authorized? end end def self.registered(app) app.helpers Helpers app.enable :sessions app.set :username => 'frank', :password => 'sinatra' app.get '/login' do slim :login end app.post '/login' do if params[:username] == settings.username && params[:password] == settings.password session[:admin] = true flash[:notice] = "You are now logged in as #{settings.username}" redirect to('/') else flash[:notice] = "The username or password you entered are incorrect" redirect to('/login') end end app.get '/logout' do session[:admin] = nil flash[:notice] = "You have now logged out" redirect to('/') end end end register Auth end 

В верхней части файла нам требуется 'sinatra/base' . Каждое расширение Sinatra должно требовать этот файл — это ядро ​​Sinatra без кода, необходимого для реального применения.

Нам также требуется Sinatra :: Flash, так как расширение будет использовать flash для отображения сообщений после входа и выхода пользователя.

Наше расширение затем создается как модуль, вложенный в модуль Sinatra . Это стандартная структура для всех расширений Sinatra.

Мы помещаем вспомогательные методы, которые наше расширение будет использовать в начале модуля. Они создаются внутри собственного модуля под названием « Helpers (вы можете называть его как угодно, но « Helpers похоже, имеют смысл).

Внутри модуля Helpers мы добавили два вспомогательных метода. Первый authorized? , который проверяет, вошел ли пользователь в систему, проверяя, является ли значение session[:admin] истинным. Это хороший метод для использования в обработчиках маршрутов и представлениях.

Второй способ protected! , Он указывает, что обработчик маршрута может быть доступен только пользователю, вошедшему в систему (обратите внимание, что он использует метод authorized? Helper, чтобы проверить это).

Этот следующий использует метод halt Синатры, который немедленно останавливает запрос и возвращает указанный HTTP-код (в данном случае 401). Он также показывает представление, называемое unauthorized , которое мы вскоре создадим и сохраним в нашем каталоге представлений.

После помощников мы разработаем специальный метод, называемый self.registered(app) . Он содержит все настройки для добавочного номера и все обработчики маршрутов. Он также указывает имя модуля помощников, который мы только что создали. Все методы, содержащиеся в этом методе, должны быть методами объекта app , который является аргументом метода self.registered и фактически является приложением, использующим расширение.

Следующая строка говорит об использовании модуля под названием « Helpers для помощников.

После этого мы включаем sessions и создаем некоторые настройки. Эти настройки могут быть переопределены в main.rb , что означает, что вы можете изменить все настройки, используемые расширением, не касаясь файла расширения. Они просто настройки по умолчанию.

Тогда есть обработчики маршрута. Они почти такие же, как те, что мы создали в предыдущей главе, хотя сейчас мы используем Sinatra :: Flash для добавления некоторых приятных сообщений, когда пользователь входит в систему и выходит из нее.

Наконец, в конце файла мы регистрируем расширение.

После сохранения файла добавьте следующую строку в список требований вверху main.rb :

  требует './sinatra/auth' 

Наконец, как упоминалось выше, нам нужен unauthorized вид:

  h1 Несанкционированный
 p Вы должны войти в систему для просмотра этой страницы. 

Перезапустите сервер, и вы сможете войти и выйти, используя наше новое расширение. Чтобы упростить задачу, давайте добавим ссылку, чтобы пользователи могли сделать это в нижнем колонтитуле. Мы хотим, чтобы это было на каждой странице, поэтому давайте добавим следующий код в конец layout.slim :

  нижний колонтитул
   - если разрешено?
     a href = "/ logout" выйти
   - еще
     a href = "/ login" войти 

Это использует authorized? помощник, чтобы проверить, вошел ли пользователь в систему или нет, а затем представляет соответствующую ссылку (для входа или выхода).

Наша последняя задача — использовать protected! способ требовать от пользователей входа на определенные страницы. Например, страница для создания новой песни должна быть доступна только пользователю, вошедшему в систему, поэтому она должна быть protected! метод помещается в начало обработчика маршрута. Откройте song.rb и измените его так, чтобы он выглядел как
следующее:

  получить "/ песни / новые" сделать
 защищены! 

Я настоятельно рекомендую вам добавить protected! метод создания, редактирования, обновления и
удалите обработчики маршрута тоже!

Смысл создания расширения Auth заключается в том, чтобы его можно было повторно использовать в других приложениях, но маловероятно, что другие приложения захотят использовать то же имя пользователя и пароль (не говоря уже об угрозе безопасности). Изменение это
правда, просто; вам даже не нужно редактировать файл auth.rb ; Вы можете просто установить их из main.rb , вот так:

  set: username, 'daz'
 набор: пароль, «секрет» 

Настройки в основном файле приложения всегда будут заменять настройки по умолчанию в файле расширения, что упрощает настройку параметров расширения без необходимости ковыряться в коде расширения.

Спасибо за это, Daz. Вот вам и все, что вы можете ожидать, приобретя новую книгу Даррена « Jump Start Sinatra» .