-
-
Save kdwinter/438370 to your computer and use it in GitHub Desktop.
module Authenticable | |
def self.included(model) | |
model.class_eval do | |
extend ClassMethods | |
include InstanceMethods | |
field :username | |
field :email | |
field :crypted_password | |
field :password_salt | |
field :persistence_token | |
field :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 | |
index :username | |
index :email | |
index :persistence_token | |
index :last_login_at | |
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 | |
module ClassMethods | |
def <(klass) | |
return true if klass == ::ActiveRecord::Base | |
super(klass) | |
end | |
def column_names | |
fields.map &:first | |
end | |
def quoted_table_name | |
'users' | |
end | |
def primary_key | |
# FIXME: Is this check good enough? | |
if caller.first.to_s =~ /(persist|session)/ | |
:_id | |
else | |
@@primary_key | |
end | |
end | |
def default_timezone | |
:utc | |
end | |
def find_by__id(*args) | |
find *args | |
end | |
# Change this to your preferred login field | |
def find_by_username(username) | |
where(:username => username).first | |
end | |
def with_scope(query) | |
query = where(query) if query.is_a?(Hash) | |
yield query | |
end | |
end | |
module InstanceMethods | |
def readonly? | |
false | |
end | |
end | |
end |
class User | |
include Mongoid::Document | |
include Mongoid::Timestamps | |
include Authenticable | |
acts_as_authentic do |config| | |
# Change this to your preferred login field | |
config.login_field = 'username' | |
config.merge_validates_uniqueness_of_login_field_options :scope => '_id', :case_sensitive => true | |
end | |
end |
class UserSession < Authlogic::Session::Base | |
def to_key | |
new_record? ? nil : [self.send(self.class.primary_key)] | |
end | |
end |
Is this still working for people? I'm getting this error:
/Users/charlie/.rvm/gems/ruby-1.9.2-p180/gems/mongoid-2.0.2/lib/mongoid/criterion/inclusion.rb:153:in `where': wrong number of arguments (2 for 1) (ArgumentError) from /Users/charlie/.rvm/gems/ruby-1.9.2-p180/gems/mongoid-2.0.2/lib/mongoid/finders.rb:14:in `block (2 levels) in ' from /Users/charlie/.rvm/gems/ruby-1.9.2-p180/gems/authlogic-3.0.3/lib/authlogic/acts_as_authentic/logged_in_status.rb:34:in `block in included' from /Users/charlie/.rvm/gems/ruby-1.9.2-p180/gems/authlogic-3.0.3/lib/authlogic/acts_as_authentic/logged_in_status.rb:32:in `class_eval' from /Users/charlie/.rvm/gems/ruby-1.9.2-p180/gems/authlogic-3.0.3/lib/authlogic/acts_as_authentic/logged_in_status.rb:32:in `included' from /Users/charlie/.rvm/gems/ruby-1.9.2-p180/gems/authlogic-3.0.3/lib/authlogic/acts_as_authentic/base.rb:37:in `include' from /Users/charlie/.rvm/gems/ruby-1.9.2-p180/gems/authlogic-3.0.3/lib/authlogic/acts_as_authentic/base.rb:37:in `block in acts_as_authentic' from /Users/charlie/.rvm/gems/ruby-1.9.2-p180/gems/authlogic-3.0.3/lib/authlogic/acts_as_authentic/base.rb:37:in `each' from /Users/charlie/.rvm/gems/ruby-1.9.2-p180/gems/authlogic-3.0.3/lib/authlogic/acts_as_authentic/base.rb:37:in `acts_as_authentic' from /Users/charlie/Developer/Ruby/bitpal/app/models/user.rb:8:in `' from /Users/charlie/Developer/Ruby/bitpal/app/models/user.rb:2:in `'
Authlogic is calling the "where" method with two arguments, which I guess isn't how mongoid works:
where("last_request_at > ?", logged_in_timeout.seconds.ago)
interesting, I'm trying to make the original pastie work with sinatra, but so far no luck, thinking it's almost 2 years old I believe some stuff have evolved
yet something stroke me : your code looks much more modular and doesn't have the part where some methods (callbacks) are generated) is it because of mongoid or just the way you wrote the thing ?
I gave up and switched to Devise :)
Having the same problem like cmelbye, I found out that it is enough to comment out the line
include Authlogic::ActsAsAuthentic::LoggedInStatus
as this sub-module causes the where problem.
Understand where a problem :(
Started POST "/sessions" for 127.0.0.1 at 2011-11-07 16:09:18 +0300
Processing by SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"bB2XWOa8vsAW0Zd2DK0GeTAaOgpU5cbUK7JPnFsaH2s=", "session"=>{"username"=>"jpascal", "password"=>"[FILTERED]"}, "commit"=>"Login"}
MONGODB grabs['system.namespaces'].find({})
MONGODB grabs['users'].find({:username=>"jpascal"}).limit(-1).sort([[:_id, :asc]])
Completed 500 Internal Server Error in 185ms
TypeError (nil is not a symbol):
app/controllers/sessions_controller.rb:10:in `create'
Rendered /usr/local/rvm/gems/ruby-1.9.2-p290@hotelgrab/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.5ms)
Rendered /usr/local/rvm/gems/ruby-1.9.2-p290@hotelgrab/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (2.1ms)
Rendered /usr/local/rvm/gems/ruby-1.9.2-p290@hotelgrab/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (8.5ms)
class SessionsController < ApplicationController
...
def create
@user_session = UserSession.new(params[:session])
if @user_session.save
redirect_to root_url
else
render :action => 'new'
end
end
...
end
index({:username => 1}, {:unique => true})
index({:email => 1}, {:unique => true})
index({:persistence_token => 1}, {:unique => true})
It's new syntax for creating indexes
On the user model do:
Fixes the errors I had with recent mongoid/authlogic.