Skip to content

Instantly share code, notes, and snippets.

@spullen
Created November 15, 2012 15:28
Show Gist options
  • Save spullen/4079177 to your computer and use it in GitHub Desktop.
Save spullen/4079177 to your computer and use it in GitHub Desktop.
Hybrid Authentication 3
# config/initializers/devise.rb
# Use this hook to configure devise mailer, warden hooks and so forth.
# Many of these configuration options can be set straight in your model.
Devise.setup do |config|
# snip...
config.warden do |manager|
manager.default_strategies(:scope => :user).unshift :ldap_authenticatable
end
# snip...
end
# lib/ldap_database_overrideable/ldap_database_overridable.rb
require 'devise'
module LdapDatabaseOverridable
extend ActiveSupport::Concern
included do
class_eval do
validates :username, :presence => true, :uniqueness => true
validates :email, :presence => true, :uniqueness => true, :format => { :with => /\A[^@]+@[^@]+\z/ }
validates :password, :presence => true, :confirmation => true, :length => { :minimum => 6 }, :if => :encrypt_password?
before_save :encrypt_password, :if => :encrypt_password?
end
end
def password=(new_password)
@password = new_password
end
protected
def encrypt_password?
password.present? && respond_to?(:encrypted_password=) && respond_to?(:password_digest)
end
def encrypt_password
self.encrypted_password = password_digest(password)
end
end
Devise.add_module(:ldap_database_overridable,
:route => :session,
:strategy => false,
:controller => :sessions,
:model => 'ldap_database_overridable')
# db/migrate/<timestamp>_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
## Database authenticatable
t.string :email, :null => false, :default => ""
t.string :username, :null => false, :default => ""
t.string :encrypted_password, :null => false, :default => ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, :default => 0
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Confirmable
# t.string :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
# t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
# t.string :unlock_token # Only if unlock strategy is :email or :both
# t.datetime :locked_at
## Token authenticatable
# t.string :authentication_token
t.timestamps
end
add_index :users, :email, :unique => true
add_index :users, :username, :unique => true
add_index :users, :reset_password_token, :unique => true
# add_index :users, :confirmation_token, :unique => true
# add_index :users, :unlock_token, :unique => true
# add_index :users, :authentication_token, :unique => true
end
end
# app/models/user.rb
class User < ActiveRecord::Base
devise :ldap_authenticatable, :database_authenticatable, :rememberable, :trackable, :ldap_database_overridable
attr_accessible :username, :email, :password, :password_confirmation, :remember_me
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment