2013-08-15 4 views

ответ

5

Возможно использование Authlogic с Mongoid путем патча обезьян Authlogic. YMMV.

Сначала добавьте оба Authlogic и Mongoid в Gemfile.

gem 'mongoid', github: 'mongoid/mongoid' # Currently required for Rails 4 
gem 'authlogic', '~> 3.3.0' 

Следующий патч обезьяны Authlogic. Сначала сделайте каталог lib/modules и создать файл lib/modules/login.rb

# lib/modules/login.rb 
module Authlogic 
    module ActsAsAuthentic 
    module Login 
     module Config 
     def find_by_smart_case_login_field(login) 
      # Case insensitivity for my project means downcase. 
      login = login.downcase unless validates_uniqueness_of_login_field_options[:case_sensitive] 

      if login_field 
      where({ login_field.to_sym => login }).first 
      else 
      where({ email_field.to_sym => login }).first 
      end 
     end 
     end 
    end 
    end 
end 

СКАЖИТЕ рельсы загрузить новый модуль редактирования config/application.rb

# config/application.rb 
module YourApp 
    class Application < Rails::Application 
    config.autoload_paths += %W(#{config.root}/lib) # ADD THIS 
    end 
end 

Расскажите рельсы требовать вашего модуля путем создания config/initializers/authlogic.rb и добавить одну строки:

# config/initializers/authlogic.rb 
require 'modules/login.rb' 

Следующим шагом является забота об аутентификации. Обеспокоенность доступны только по умолчанию в Rails 4. Вам нужно будет добавить это непосредственно к authenticable класса в Rails 3.

# app/models/concerns/authenticable.rb 
module Authenticable 
    extend ActiveSupport::Concern 

    included do 
    include Authlogic::ActsAsAuthentic::Base 
    include Authlogic::ActsAsAuthentic::Email 
    include Authlogic::ActsAsAuthentic::LoggedInStatus 
    include Authlogic::ActsAsAuthentic::Login 
    include Authlogic::ActsAsAuthentic::MagicColumns 
    include Authlogic::ActsAsAuthentic::Password 
    include Authlogic::ActsAsAuthentic::PerishableToken 
    include Authlogic::ActsAsAuthentic::PersistenceToken 
    include Authlogic::ActsAsAuthentic::RestfulAuthentication 
    include Authlogic::ActsAsAuthentic::SessionMaintenance 
    include Authlogic::ActsAsAuthentic::SingleAccessToken 
    include Authlogic::ActsAsAuthentic::ValidationsScope 
    end 

    def readonly? 
    false 
    end 

    module ClassMethods 
    def <(klass) 
     return true if klass == ::ActiveRecord::Base 
     super(klass) 
    end 

    def column_names 
     fields.map &:first 
    end 

    def quoted_table_name 
     self.name.underscore.pluralize 
    end 

    def default_timezone 
     :utc 
    end 

    def primary_key 
     if caller.first.to_s =~ /(persist|session)/ 
     :_id 
     else 
     @@primary_key 
     end 
    end 

    def find_by__id(*args) 
     find *args 
    end 

    def find_by_persistence_token(token) 
     where(persistence_token: token).first 
    end 

    # Replace this with a finder to your login field 
    def find_by_email(email) 
     where(email: email).first 
    end 

    def with_scope(query) 
     query = where(query) if query.is_a?(Hash) 
     yield query 
    end 
    end 
end 

Это в основном это. Вот пример User класс.

# app/models/user.rb 
class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    include Authenticable 

    field :name 
    field :email 
    field :crypted_password 
    field :password_salt 
    field :persistence_token 
    field :single_access_token 
    field :perishable_token 

    field :login_count,  type: Integer, default: 0 
    field :failed_login_count, type: Integer, default: 0 
    field :last_request_at, type: DateTime 
    field :last_login_at,  type: DateTime 
    field :current_login_at, type: DateTime 
    field :last_login_ip 
    field :current_login_ip 

    field :role, type: Symbol, default: :user 

    index({ name: 1 }) 
    index({ email: 1 }, { unique: true }) 
    index({ persistence_token: 1}, { unique: true }) 
    index({ last_login_at: 1}) 

    validates :name, presence: true 
    validates :email, presence: true, uniqueness: true 
    validates :crypted_password, presence: true 
    validates :password_salt, presence: true 

    acts_as_authentic do |config| 
    config.login_field = 'email' # Remember to add a finder for this 
    end 
end 

UserSession будет выглядеть следующим образом:

# app/models/user_session.rb 
class UserSession < Authlogic::Session::Base 
    def to_key 
    new_record? ? nil : [self.send(self.class.primary_key)] 
    end 

    def to_partial_path 
    self.class.name.underscore 
    end 
end 

применения хелперов контроллера такие же, как всегда.

# app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    helper_method :current_user 

    private 
    def current_user_session 
    @current_user_session = UserSession.find unless 
     defined?(@current_user_session) 
    @current_user_session 
    end 

    def current_user 
    @current_user = current_user_session && 
     current_user_session.user unless defined?(@current_user) 
    @current_user 
    end 
end 

Все. Все остальное должно работать точно так, как раньше.

 Смежные вопросы

  • Нет связанных вопросов^_^