module Authlogic module Session # Authlogic tries to check the state of the record before creating the session. If your record responds to the following methods and any of them return false, validation will fail: # # Method name Description # active? Is the record marked as active? # approved? Has the record been approved? # confirmed? Has the record been conirmed? # # Authlogic does nothing to define these methods for you, its up to you to define what they mean. If your object responds to these methods Authlogic will use them, otherwise they are ignored. # # What's neat about this is that these are checked upon any type of login. When logging in explicitly, by cookie, session, or basic http auth. So if you mark a user inactive in the middle of their session they wont be logged back in next time they refresh the page. Giving you complete control. # # Need Authlogic to check your own "state"? No problem, check out the hooks section below. Add in a before_validation to do your own checking. The sky is the limit. module MagicStates def self.included(klass) klass.class_eval do extend Config include InstanceMethods validate :validate_magic_states, :unless => :disable_magic_states? end end # Configuration for the magic states feature. module Config # Set this to true if you want to disable the checking of active?, approved?, and confirmed? on your record. This is more or less of a # convenience feature, since 99% of the time if those methods exist and return false you will not want the user logging in. You could # easily accomplish this same thing with a before_validation method or other callbacks. # # * Default: false # * Accepts: Boolean def disable_magic_states(value = nil) rw_config(:disable_magic_states, value, false) end alias_method :disable_magic_states=, :disable_magic_states end # The methods available for an Authlogic::Session::Base object that make up the magic states feature. module InstanceMethods private def disable_magic_states? self.class.disable_magic_states == true end def validate_magic_states return true if attempted_record.nil? [:active, :approved, :confirmed].each do |required_status| if attempted_record.respond_to?("#{required_status}?") && !attempted_record.send("#{required_status}?") errors.add(:base, I18n.t("error_messages.not_#{required_status}", :default => "Your account is not #{required_status}")) return false end end true end end end end end