Give me a long enough lever and I'll move the world. Give me enough string, sash pulleys and door closers and I'll mount EFX for you. -- Kit Lane
ГлавнаяСтатьи Создание системы аутентификации в Ruby on Rails с помощью pluginа acts_as_authenticated
Создание системы аутентификации в Ruby on Rails с помощью pluginа acts_as_authenticated
Практически любое современное более менее крупное Web приложение, использует систему аутентификации. Здесь мы научимся создавать такого рода вещи самостоятельно в проектах Ruby on Rails. Для этого воспользуемся pluginом acts_as_authenticated. Во фреймворке Ruby on Rails plugin – это расширения или дополнения возможностей Ruby on Rails. То бишь это некий код, который можно установить и использовать в проекте, чтобы получить доступ к некоторому количеству дополнительных возможностей. Далее описываем последовательность действий пошагово.
1. Вначале создадим новый проект c помощью командной строки:
После этого, нам нужно отредактировать файл конфигурации базы данных. Он находиться как обычно в директории «/config» и называется «database.yml» . Там мы увидим наст ройки баз данных, примерно такого вида:
Здесь надо ввести имя пользователя и пароль к базе данных MySQL , которые используется на текущем компьютере. Естественно, необходимо создать указанные базы данных или хотя бы одну базу данных. Согласно идеологии Ruby on Rails, проект может использовать 3 базы данных: «_development», «_test» и «_production». Соответственно, каждая из них используется для разработки проекта, другая для тестирования и последняя, в качестве рабочей. Создадим базу «myproject_development».
Теперь нужно создать какой-нибудь работающий код, например, модуль «Meeting», в который нам нужно будет заходить с использованием авторизации. Сперва делаем таблицу «meetings». Чтобы не заморачиваться, пусть она будет очень простая.
DEPRECATED: Use restful_authentication instead. Or, ask me for commit rights if
you wish to maintain this plugin.
This is a basic authentication generator for rails, very much in the spirit of x
al's original Login Generator.
To use:
./script/generate authenticated user account
This generates a basic user model, a controller, some basic views, and tests. E
xtra functionality can be unlocked by
removing the comments for them. I have a few examples such as user activation a
nd reversible encrypted passwords.
The user migration is also generated unless you pass --skip-migration.
Generate your mailer:
./script/generate authenticated_mailer user
Consult the Acts As Authenticated wiki for more: http://technoweenie.stikipad.co
m/plugins/show/Acts+as+Authenticated
Команда «ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/acts_as_authenticated/»
устанавливает plugin в наш проект. При этом генерируются практически все необходимые файлы, которые будут использоваться в системе аутентификации. Теперь нам нужно создать саму систему – модель- представление – контролер с помощью команды « ruby script/generate authenticated user account» в командной строке.
C:myproject>ruby script/generate authenticated user account
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/account
exists test/functional/
exists test/unit/
create app/models/user.rb
create app/controllers/account_controller.rb
create lib/authenticated_system.rb
create lib/authenticated_test_helper.rb
create test/functional/account_controller_test.rb
create app/helpers/account_helper.rb
create test/unit/user_test.rb
create test/fixtures/users.yml
create app/views/account/index.rhtml
create app/views/account/login.rhtml
create app/views/account/signup.rhtml
create db/migrate
create db/migrate/001_create_users.rb
Далее здесь же создаем рассылку сообщений для работы с пользователями. Также создается с помощью команды «ruby script/generate authenticated_mailer user».
C:myproject>ruby script/generate authenticated_mailer user
Строка « include AuthenticatedSystem» активирует нашу систему аутентификации, загружая ее при запуске приложения. После этого, нам нужно запустить приложение. В командной строке вводим:
C:myproject> ruby script/server
После этого, нужно в браузере открыть такой адрес:
http://localhost:3000/account/signup
На этой странице мы увидим форму для регистрации нового пользователя. Ее необходимо заполнить и нажать кнопку. Откроется новая страница со стихотворением канзасского поэтессы , Ellen P. Allerton « In the Caboose.» (В тамбуре.) Наверное, это любимые стихи разработчика данного plugina. В любом случае, эту страницу нам нужно удалить эту страницу. Вместо нее, лучше использовать в качестве «index.rhtml» форму «login.rhtml»
Кроме этого, нужно отредактировать файл «account_controller.rb», метод «login»
Затем нам нужно отредактировать файл контроллера, чтобы запретить вход для посторонних. Для этого нужно ввести такую строку в файл «meetings_controller.rb», расположенный в папке «/app/controllers/» нашего проекта:
class MeetingsController < ApplicationController
before_filter :login_required
def index //далее следуют код метода “index”
Сохраняем файл и пробуем зайти по адресу: http://localhost:3000/meetings/ Вместо списка видим форму для ввода логина и пароля. Если ввести там все правильно, то увидим список встреч. Заработало. 
Далее нужно отредактировать файл «list.rhtml» «/app/views/meetings/», чтобы добавить туда опцию выхода из текущего интерфейса. Добавленный код выделен курсивом.
На этом мы закончили с базовой часть системы аутентификации. Далее мы улучшим и расширим ее.
4. Теперь нам необходимо сделать регистрацию пользователей. Для начала отредактируем наш обновленный « index.rhtml» « /app/views/account/». Нам нужно добавить туда ссылку на регистрацию новых пользователей. После этой процедуры, вид у этого файла будет такой:
<% form_tag do -%>
<p><label for="login">Login</label><br/>
<%= text_field_tag 'login' %></p>
<p><label for="password">Password</label><br/>
<%= password_field_tag 'password' %></p>
<p><label for="remember_me">Remember me:</label> // Эта опция закомментирована,
//но мы можем ее открыть, чтобы
// система запоминала нас
<%= check_box_tag 'remember_me' %></p>
<p>Not a member yet?
<%= link_to 'Click Here', :action => 'signup' %> to sign up today!</p>
Курсивом отмечен новый код в файле. Теперь нам весьма желательно описать новую модель регистрации пользователей.
А. Новый пользователь вводит свой логин, пароль и е-мейл и жмет кнопку.
B. Ему отправляется письмо, с просьбой подтвердить его е-мейл.
С. После клика на активационном линке новый пользователь считается зарегистрированным.
Все выглядит достаточно просто. Но чтобы это заработало, нам нужно сделать кое-какие изменения в существующем и добавить новый код в наш проект. Сначала отредактируем наш файл настроек среды, «environment.rb» «/config». Мы обязаны указать способ отправки сообщений электронной почты.- config.action_mailer.delivery_method = :sendmail. Эту строку добавляем в самый низ файла. Вид этого файла будет такой:
# Be sure to restart your web server when you modify this file.
# Uncomment below to force Rails into production mode when
# you don't control web/app server and can't set it the proper way
# ENV['RAILS_ENV'] ||= 'development'
# Specifies gem version of Rails to use when vendor/rails is not present
Можно использовать также протокол SMTP, только для этого надо написать по-другому. Естественно, все настройки должны быть установлены согласно текущей конфигурации SMTP сервера. Описание этой настройки широко представлены в документации по Ruby on Rails.
Теперь нам нужно создать метод класса «user.rb», генерирующий уникальный набор символов для линка по подтверждения доставки сообщения новому пользователю. Открываем данный файл и пишем:
Остановимся на нем подробнее .Этот метод создает строку символов, используя уже нам известный метод класса «Digest::SHA1.hexdigest» Он включен в класс модели посредством require'digest/sha1'.Также мы используем здесь текущее время «Time.now.to_s», сконвертировав его сразу же в строку и иcпользуя символ разделения « //». После чего все сортируется случайными образом и склеивается. «sort_by{rand}.join»
Теперь надо вставить метод before_create :do_code в начало класса модели «user.rb». При создании нового пользователя обязательно запустит метод « do_code».
Ранее мы сгенерировали также файлы почтовой рассылки, там нужно открыть файл «user_observer.rb», который следит за всеми действиями, происходящими с моделью User и может производить определенный действия в ответ:
Эти метод создаются при cсоздании кода класса обозревателя. Нам ничего здесь писать не нужно. Единственное, что необходимо, это отредактировать файл «environment.rb» и добавть туда:
Нам нужно также изменить тексты сообщений, заголовки, URL нашего сайта и т.д. На конец, снова отредактируем класс метода User «user.rb». Во-первых, надо добавить такой метод:
Он устанавливает очень важную булеву переменную «@activated» в «true» и затем обновляет значение поля таблицы базы данных «users» : «activated_at», в который записывает текущее значение даты и обнуляет значение поля «activation_code». Последнее нам надо для того, чтобы мы были уверены, что это поле ничего не содержит. Еще один метод, который мы здесь добавим, это метод «recently_activated» . Он присутствует в коде класса « UserNotifier»
Мы здесь вновь создаем этот метод, использующий переменную «@activated». То бишь, мы сможем быть уверены, что активация произошла с помощью метода «activate» , иначе значение переменной будет «nil» и дальнейшая проверка не допустит входа в систему не зарегистрированных по правилам пользователей.
И еще напоследок, надо исправить там же метод «self.authenticate»:
def self.authenticate(login, password)
u = find :first, :conditions => ['login = ? and activated_at IS NOT NULL', login]