Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Here's what we're doing (largely taken from authenticated system) ... this is the controller method that handles login that we're running...</p> <pre><code>def login if logged_in? flash[:notice] = "You are already logged in." redirect_to "/" and return end unless request.post? render :layout =&gt; 'task' and return end self.current_user = User.authenticate(params[:login], params[:password]) if logged_in? if params[:remember_me].to_i == 1 self.current_user.remember_me cookies[:auth_token] = {:domain =&gt; "#{DOMAIN}", :value =&gt; self.current_user.remember_token , :expires =&gt; self.current_user.remember_token_expires_at } else self.current_user.forget_me cookies.delete(:auth_token, :domain =&gt; "#{DOMAIN}") cookies[:auth_token] = nil end current_user.last_seen_at = Time.now current_user.save session[:notice] = "You logged in successfully" flash[:notice] = "You logged in successfully" redirect_back_or_default(:controller =&gt; 'dashboard') and return #redirect_back_or_default(:controller =&gt; 'index', :action =&gt; 'index') and return else if $failed_login_counter.add_attempt(params[:login]) &gt; MAXIMUM_LOGIN_ATTEMPTS logger.info("login rate limiter kicking in, #{MAXIMUM_LOGIN_ATTEMPTS} login attempts failed") redirect_to "/denied.html" and return end flash[:error] = "Unable to authenticate username and password" render(:layout =&gt; 'task') and return end end </code></pre> <p>And use this for logout</p> <pre><code>def logout current_user.last_seen_at = Time.now current_user.save self.current_user.forget_me if logged_in? cookies.delete(:auth_token, :domain =&gt; "#{DOMAIN}") reset_session flash[:notice] = "You have been logged out." #redirect_to :back redirect_back_or_default(:controller =&gt; 'index', :action =&gt; 'index') and return end </code></pre> <p>Then - in your application.rb you'll need something like:</p> <pre><code>before_filter :login_from_cookie def login_from_cookie return unless cookies[:auth_token] &amp;&amp; !logged_in? user = User.find_by_remember_token(cookies[:auth_token]) if user &amp;&amp; user.remember_token? user.remember_me self.current_user = user cookies[:auth_token] = { :domain =&gt; "#{DOMAIN}", :value =&gt; self.current_user.remember_token , :expires =&gt; self.current_user.remember_token_expires_at } flash[:notice] = "#{self.current_user.login}, you have logged in successfully" end end </code></pre> <p>And - in your User model have some methods like this:</p> <pre><code># Encrypts some data with the salt. def self.encrypt(password, salt) Digest::SHA1.hexdigest("--#{salt}--#{password}--") end # Encrypts the password with the user salt def encrypt(password) self.class.encrypt(password, salt) end def remember_token? remember_token_expires_at &amp;&amp; Time.now.utc &lt; remember_token_expires_at end # These create and unset the fields required for remembering users between browser closes def remember_me self.remember_token_expires_at = 2.weeks.from_now.utc self.remember_token = encrypt("#{email}--#{remember_token_expires_at}") save(false) end def forget_me self.remember_token_expires_at = nil self.remember_token = nil save(false) end </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload