Skip to content
This repository has been archived by the owner on Sep 24, 2020. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
add Devise based authentication system
  • Loading branch information
Eric-Guo committed Mar 2, 2014
1 parent c56114d commit 45c8cc8
Show file tree
Hide file tree
Showing 23 changed files with 651 additions and 10 deletions.
1 change: 1 addition & 0 deletions Gemfile
Expand Up @@ -47,3 +47,4 @@ end
gem 'win32console', :platforms => :mingw
gem 'bootstrap-sass'
gem 'bootstrap-will_paginate'
gem 'devise'
13 changes: 13 additions & 0 deletions Gemfile.lock
Expand Up @@ -27,6 +27,9 @@ GEM
tzinfo (~> 0.3.37)
arel (4.0.2)
atomic (1.1.15)
bcrypt (3.1.7-x86-mingw32)
bcrypt-ruby (3.1.5-x86-mingw32)
bcrypt (>= 3.1.3)
bootstrap-sass (3.1.1.0)
sass (~> 3.2)
bootstrap-will_paginate (0.0.10)
Expand All @@ -39,6 +42,12 @@ GEM
coffee-script-source
execjs
coffee-script-source (1.7.0)
devise (3.2.3)
bcrypt-ruby (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5)
thread_safe (~> 0.1)
warden (~> 1.2.3)
erubis (2.7.0)
execjs (2.0.2)
hike (1.2.3)
Expand All @@ -56,6 +65,7 @@ GEM
mime-types (1.25.1)
minitest (4.7.5)
multi_json (1.8.4)
orm_adapter (0.5.0)
polyglot (0.3.4)
rack (1.5.2)
rack-test (0.6.2)
Expand Down Expand Up @@ -105,6 +115,8 @@ GEM
uglifier (2.4.0)
execjs (>= 0.3.0)
json (>= 1.8.0)
warden (1.2.3)
rack (>= 1.0)
will_paginate (3.0.5)
win32console (1.3.2-x86-mingw32)

Expand All @@ -115,6 +127,7 @@ DEPENDENCIES
bootstrap-sass
bootstrap-will_paginate
coffee-rails (~> 4.0.0)
devise
jbuilder (~> 2.0)
jquery-rails
rails (= 4.0.3)
Expand Down
23 changes: 23 additions & 0 deletions app/models/user.rb
@@ -0,0 +1,23 @@
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

validates :badge, presence: true, uniqueness: true, :length => { :minimum => 2 }
validates :email, uniqueness: true, :allow_blank => true

protected
def email_required?
false
end

def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:badge)
where(conditions).where(["lower(badge) = :value OR lower(email) = :value", { :value => login.downcase }]).first
else
where(conditions).first
end
end
end
14 changes: 14 additions & 0 deletions app/views/devise/confirmations/new.html.erb
@@ -0,0 +1,14 @@
<div class="jumbotron">
<h2>Resend confirmation instructions</h2>

<%= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f| %>
<%= devise_error_messages! %>

<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>

<div><%= f.submit "Resend confirmation instructions" %></div>
<% end %>
<%= render "devise/shared/links" %>
</div>
5 changes: 5 additions & 0 deletions app/views/devise/mailer/confirmation_instructions.html.erb
@@ -0,0 +1,5 @@
<p>Welcome <%= @email %>!</p>

<p>You can confirm your account email through the link below:</p>

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token) %></p>
8 changes: 8 additions & 0 deletions app/views/devise/mailer/reset_password_instructions.html.erb
@@ -0,0 +1,8 @@
<p>Hello <%= @resource.email %>!</p>

<p>Someone has requested a link to change your password. You can do this through the link below.</p>

<p><%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @token) %></p>

<p>If you didn't request this, please ignore this email.</p>
<p>Your password won't change until you access the link above and create a new one.</p>
7 changes: 7 additions & 0 deletions app/views/devise/mailer/unlock_instructions.html.erb
@@ -0,0 +1,7 @@
<p>Hello <%= @resource.email %>!</p>

<p>Your account has been locked due to an excessive number of unsuccessful sign in attempts.</p>

<p>Click the link below to unlock your account:</p>

<p><%= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @token) %></p>
18 changes: 18 additions & 0 deletions app/views/devise/passwords/edit.html.erb
@@ -0,0 +1,18 @@
<div class="jumbotron">
<h2>Change your password</h2>

<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %>
<%= devise_error_messages! %>
<%= f.hidden_field :reset_password_token %>

<div><%= f.label :password, "New password" %><br />
<%= f.password_field :password, :autofocus => true %></div>

<div><%= f.label :password_confirmation, "Confirm new password" %><br />
<%= f.password_field :password_confirmation %></div>

<div><%= f.submit "Change my password" %></div>
<% end %>
<%= render "devise/shared/links" %>
</div>
14 changes: 14 additions & 0 deletions app/views/devise/passwords/new.html.erb
@@ -0,0 +1,14 @@
<div class="jumbotron">
<h2>Forgot your password?</h2>

<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| %>
<%= devise_error_messages! %>

<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>

<div><%= f.submit "Send me reset password instructions" %></div>
<% end %>
<%= render "devise/shared/links" %>
</div>
34 changes: 34 additions & 0 deletions app/views/devise/registrations/edit.html.erb
@@ -0,0 +1,34 @@
<div class="jumbotron">
<h2>Edit <%= resource_name.to_s.humanize %></h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
<%= devise_error_messages! %>

<div><%= f.label :badge %><br />
<%= f.text_field :badge %></div>

<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>

<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
<% end %>

<div><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password, :autocomplete => "off" %></div>

<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>

<div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password %></div>

<div><%= f.submit "Update" %></div>
<% end %>

<h3>Cancel my account</h3>

<p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), :data => { :confirm => "Are you sure?" }, :method => :delete %></p>

<%= link_to "Back", :back %>
</div>
23 changes: 23 additions & 0 deletions app/views/devise/registrations/new.html.erb
@@ -0,0 +1,23 @@
<div class="jumbotron">
<h2>Sign up</h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>

<div><%= f.label :badge %><br />
<%= f.text_field :badge, :autofocus => true %></div>

<div><%= f.label :email %><br />
<%= f.email_field :email %></div>

<div><%= f.label :password %><br />
<%= f.password_field :password %></div>

<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>

<div><%= f.submit "Sign up" %></div>
<% end %>
<%= render "devise/shared/links" %>
</div>
19 changes: 19 additions & 0 deletions app/views/devise/sessions/new.html.erb
@@ -0,0 +1,19 @@
<div class="jumbotron">
<h2>Sign in</h2>

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
<div><%= f.label :badge %><br />
<%= f.text_field :badge, :autofocus => true %></div>

<div><%= f.label :password %><br />
<%= f.password_field :password %></div>

<% if devise_mapping.rememberable? -%>
<div><%= f.check_box :remember_me %> <%= f.label :remember_me %></div>
<% end -%>

<div><%= f.submit "Sign in" %></div>
<% end %>
<%= render "devise/shared/links" %>
</div>
25 changes: 25 additions & 0 deletions app/views/devise/shared/_links.erb
@@ -0,0 +1,25 @@
<%- if controller_name != 'sessions' %>
<%= link_to "Sign in", new_session_path(resource_name) %><br />
<% end -%>
<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
<%= link_to "Sign up", new_registration_path(resource_name) %><br />
<% end -%>
<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
<%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
<% end -%>
<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
<%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
<% end -%>
<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
<%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
<% end -%>
<%- if devise_mapping.omniauthable? %>
<%- resource_class.omniauth_providers.each do |provider| %>
<%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider) %><br />
<% end -%>
<% end -%>
14 changes: 14 additions & 0 deletions app/views/devise/unlocks/new.html.erb
@@ -0,0 +1,14 @@
<div class="jumbotron">
<h2>Resend unlock instructions</h2>

<%= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f| %>
<%= devise_error_messages! %>

<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>

<div><%= f.submit "Resend unlock instructions" %></div>
<% end %>
<%= render "devise/shared/links" %>
</div>
26 changes: 16 additions & 10 deletions app/views/layouts/application.html.erb
Expand Up @@ -25,7 +25,7 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Project name</a>
<a class="navbar-brand" href="/">Project name</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
Expand All @@ -49,15 +49,21 @@
<% end %>
</ul>
<ul class="nav navbar-nav navbar-right">
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
<i class="icon-user"></i> Username
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="#">Profile</a></li>
<li class="divider"></li>
<li><a href="#">Sign Out</a></li>
</ul>
<% if user_signed_in? -%>
<li class="dropdown">
<%= link_to edit_user_registration_path, class: 'dropdown-toggle', data: { toggle: "dropdown" } do -%>
<%= current_user.badge %><b class="caret"></b>
<% end -%>
<ul class="dropdown-menu">
<li><%= link_to 'Profile', edit_user_registration_path %></li>
<li class="divider"></li>
<li><%= link_to 'Logout', destroy_user_session_path, :method => :delete %></li>
</ul>
</li>
<% else -%>
<li><%= link_to 'Sign In', new_user_session_path, class: :active %></li>
<li><%= link_to 'Register', new_user_registration_path, class: :active %></li>
<% end -%>
</ul>
</div><!--/.nav-collapse -->
</div>
Expand Down

0 comments on commit 45c8cc8

Please sign in to comment.