Skip to content

Commit

Permalink
Restructure configuration for acts_as_authentic
Browse files Browse the repository at this point in the history
  • Loading branch information
binarylogic committed Mar 23, 2009
1 parent b3fb9bb commit 78f5bef
Show file tree
Hide file tree
Showing 27 changed files with 403 additions and 291 deletions.
2 changes: 2 additions & 0 deletions README.rdoc
Expand Up @@ -80,6 +80,8 @@ These modules are for the "session side" of authentication. They create a new do

=== Miscellaneous modules

Miscellaneous modules that don't really belong solely to either the session or model aspect.

* Authlogic::AuthenticatesMany - Responsible for allowing you to scope sessions to a parent record. Similar to a has_many and belongs_to relationship. This lets you do the same thing with sessions.
* Authlogic::CryptoProviders - Contains various encryption algorithms that Authlogic uses, allowing you to choose your encryption method.
* Authlogic::I18n - Acts JUST LIKE the rails I18n library, and provides internationalization to Authlogic.
Expand Down
3 changes: 1 addition & 2 deletions lib/authlogic.rb
Expand Up @@ -25,11 +25,10 @@
require File.dirname(__FILE__) + "/authlogic/acts_as_authentic/perishable_token"
require File.dirname(__FILE__) + "/authlogic/acts_as_authentic/persistence_token"
require File.dirname(__FILE__) + "/authlogic/acts_as_authentic/restful_authentication"
require File.dirname(__FILE__) + "/authlogic/acts_as_authentic/scope"
require File.dirname(__FILE__) + "/authlogic/acts_as_authentic/session_maintenance"
require File.dirname(__FILE__) + "/authlogic/acts_as_authentic/single_access_token"
require File.dirname(__FILE__) + "/authlogic/acts_as_authentic/validations_scope"
require File.dirname(__FILE__) + "/authlogic/acts_as_authentic/base"
require File.dirname(__FILE__) + "/authlogic/acts_as_authentic/config"

require File.dirname(__FILE__) + "/authlogic/session/activation"
require File.dirname(__FILE__) + "/authlogic/session/active_record_trickery"
Expand Down
108 changes: 75 additions & 33 deletions lib/authlogic/acts_as_authentic/base.rb
Expand Up @@ -2,41 +2,83 @@ module Authlogic
module ActsAsAuthentic
# Adds in the acts_as_authentic method to ActiveRecord.
module Base
# This includes a lot of helpful methods for authenticating records which The Authlogic::Session module relies on.
# To use it just do:
#
# class User < ActiveRecord::Base
# acts_as_authentic
# end
#
# Configuration is easy:
#
# acts_as_authentic do |c|
# c.my_configuration_option = my_value
# end
#
# See the various sub modules for the configuration they provide.
def acts_as_authentic(&block)
cattr_accessor :aaa_config
c = Config.new(self)
yield c if block_given?
self.aaa_config = c
def self.included(klass)
klass.class_eval do
extend Config
end
end

module Config
# This includes a lot of helpful methods for authenticating records which The Authlogic::Session module relies on.
# To use it just do:
#
# class User < ActiveRecord::Base
# acts_as_authentic
# end
#
# Configuration is easy:
#
# acts_as_authentic do |c|
# c.my_configuration_option = my_value
# end
#
# See the various sub modules for the configuration they provide.
def acts_as_authentic(&block)
yield self if block_given?
acts_as_authentic_modules.each { |mod| include mod }
end

def add_acts_as_authentic_module(mod)
modules = acts_as_authentic_modules
modules << mod
modules.uniq!
write_inheritable_attribute(:acts_as_authentic_modules, modules)
end

def remove_acts_as_authentic_module(mod)
acts_as_authentic_modules.delete(mod)
acts_as_authentic_modules
end

private
def acts_as_authentic_modules
key = :acts_as_authentic_modules
inheritable_attributes.include?(key) ? read_inheritable_attribute(key) : []
end

# We need to include these after configuration is set, because some of these module
# use the configuration when included.
include Email::Methods
include LoggedInStatus::Methods
include Login::Methods
include MagicColumns::Methods
include Password::Callbacks
include Password::Methods
include PerishableToken::Methods if column_names.include?("perishable_token")
include PersistenceToken::Methods
include SessionMaintenance::Methods
include SingleAccessToken::Methods if column_names.include?("single_access_token")
def config(key, value, default_value = nil, read_value = nil)
if value == read_value
return read_inheritable_attribute(key) if inheritable_attributes.include?(key)
write_inheritable_attribute(key, default_value)
else
write_inheritable_attribute(key, value)
end
end

def first_column_to_exist(*columns_to_check) # :nodoc:
columns_to_check.each { |column_name| return column_name.to_sym if column_names.include?(column_name.to_s) }
columns_to_check.first ? columns_to_check.first.to_sym : nil
end
end
end

::ActiveRecord::Base.extend(Base) if defined?(::ActiveRecord)
end
end

if defined?(::ActiveRecord)
module ::ActiveRecord
class Base
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
end
end
37 changes: 0 additions & 37 deletions lib/authlogic/acts_as_authentic/config.rb

This file was deleted.

17 changes: 11 additions & 6 deletions lib/authlogic/acts_as_authentic/email.rb
Expand Up @@ -5,6 +5,13 @@ module ActsAsAuthentic
# if you do have a login or username field, Authlogic will still validate your email field. One less thing you have to
# worry about.
module Email
def self.included(klass)
klass.class_eval do
extend Config
add_acts_as_authentic_module(Methods)
end
end

# Configuration to modify how Authlogic handles the email field.
module Config
# The name of the field that stores email addresses.
Expand Down Expand Up @@ -57,12 +64,10 @@ def email_regex
module Methods
def self.included(klass)
klass.class_eval do
if aaa_config.validate_email_field
if aaa_config.email_field
validates_length_of aaa_config.email_field, aaa_config.validates_length_of_email_field_options
validates_format_of aaa_config.email_field, aaa_config.validates_format_of_email_field_options
validates_uniqueness_of aaa_config.email_field, :scope => aaa_config.scope, :if => "#{aaa_config.email_field}_changed?".to_sym
end
if validate_email_field && email_field
validates_length_of email_field, validates_length_of_email_field_options
validates_format_of email_field, validates_format_of_email_field_options
validates_uniqueness_of email_field, :scope => validations_scope, :if => "#{email_field}_changed?".to_sym
end
end
end
Expand Down
18 changes: 15 additions & 3 deletions lib/authlogic/acts_as_authentic/logged_in_status.rb
Expand Up @@ -5,6 +5,13 @@ module ActsAsAuthentic
# So if that user is inactive for a certain amount of time we assume they are logged out. That's what this
# module is all about.
module LoggedInStatus
def self.included(klass)
klass.class_eval do
extend Config
add_acts_as_authentic_module(Methods)
end
end

# All configuration for the logged in status feature set.
module Config
# The timeout to determine when a user is logged in or not.
Expand All @@ -21,21 +28,26 @@ def logged_in_timeout(value = nil)
module Methods
def self.included(klass)
klass.class_eval do
named_scope :logged_in, lambda { {:conditions => ["last_request_at > ?", aaa_config.logged_in_timeout.seconds.ago]} }
named_scope :logged_out, lambda { {:conditions => ["last_request_at is NULL or last_request_at <= ?", aaa_config.logged_in_timeout.seconds.ago]} }
named_scope :logged_in, lambda { {:conditions => ["last_request_at > ?", logged_in_timeout.seconds.ago]} }
named_scope :logged_out, lambda { {:conditions => ["last_request_at is NULL or last_request_at <= ?", logged_in_timeout.seconds.ago]} }
end
end

# Returns true if the last_request_at > logged_in_timeout.
def logged_in?
raise "Can not determine the records login state because there is no last_request_at column" if !respond_to?(:last_request_at)
!last_request_at.nil? && last_request_at > aaa_config.logged_in_timeout.seconds.ago
!last_request_at.nil? && last_request_at > logged_in_timeout.seconds.ago
end

# Opposite of logged_in?
def logged_out?
!logged_in?
end

private
def logged_in_timeout
self.class.logged_in_timeout
end
end
end
end
Expand Down
19 changes: 12 additions & 7 deletions lib/authlogic/acts_as_authentic/login.rb
Expand Up @@ -2,6 +2,13 @@ module Authlogic
module ActsAsAuthentic
# Handles everything related to the login field.
module Login
def self.included(klass)
klass.class_eval do
extend Config
add_acts_as_authentic_module(Methods)
end
end

# Confguration for the login field.
module Config
# The name of the login field in the database.
Expand All @@ -27,7 +34,7 @@ def validate_login_field(value = nil)
# * <tt>Default:</tt> {:within => 6..100}
# * <tt>Accepts:</tt> Hash of options accepted by validates_length_of
def validates_length_of_login_field_options(value = nil)
config(:validates_length_of_login_field_options, value, {:within => 6..100})
config(:validates_length_of_login_field_options, value, {:within => 3..100})
end
alias_method :validates_length_of_login_field_options=, :validates_length_of_login_field_options

Expand All @@ -45,12 +52,10 @@ def validates_format_of_login_field_options(value = nil)
module Methods
def self.included(klass)
klass.class_eval do
if aaa_config.validate_login_field
if aaa_config.login_field
validates_length_of aaa_config.login_field, aaa_config.validates_length_of_login_field_options
validates_format_of aaa_config.login_field, aaa_config.validates_format_of_login_field_options
validates_uniqueness_of aaa_config.login_field, :scope => aaa_config.scope, :if => "#{aaa_config.login_field}_changed?".to_sym
end
if validate_login_field && login_field
validates_length_of login_field, validates_length_of_login_field_options
validates_format_of login_field, validates_format_of_login_field_options
validates_uniqueness_of login_field, :scope => validations_scope, :if => "#{login_field}_changed?".to_sym
end
end
end
Expand Down
6 changes: 6 additions & 0 deletions lib/authlogic/acts_as_authentic/magic_columns.rb
Expand Up @@ -4,6 +4,12 @@ module ActsAsAuthentic
# you. Authlogic has the same thing, but these are maintained on the session side. Please see Authlogic::Session::MagicColumns
# for more details. This module merely adds validations for the magic columns if they exist.
module MagicColumns
def self.included(klass)
klass.class_eval do
add_acts_as_authentic_module(Methods)
end
end

# Methods relating to the magic columns
module Methods
def self.included(klass)
Expand Down

0 comments on commit 78f5bef

Please sign in to comment.