Quality, Speed or Cheap. Pick two. - Unknown
使用者认证Authentication用以识别使用者身分,而授权Authorization则用来处理使用者有没有权限可以作哪些事情。
devise是一套使用者认证(Authentication)套件,是Rails社群中最广为使用的一套。
编辑 Gemfile 加上
gem 'devise'
bundle install
安装此套件rails g devise:install
产生devise设定档编辑 config/environments/development.rb 和 production.rb 加入寄信时默认的网站网址:
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
确认 app/views/layouts/application.html.erb layout 中可以显示 flash 讯息,例如
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
确认 routes.rb 中有设定网站首页位置,例如
root :to => "welcome#index"
rails g devise user
产生 User model 及 Migrationapp/models/user.rb
和migration
将confirmable功能打开rails generate devise:views
产生样板,这会包括有注册、登入、忘记密码、Email等等页面,放在app/views/devise目录下。bin/rake db:migrate
建立资料表before_action :authenticate_user!
可以在 Layout 中加上登入登出选单
<% if current_user %>
<%= link_to('登出', destroy_user_session_path, :method => :delete) %> |
<%= link_to('修改密碼', edit_registration_path(:user)) %>
<% else %>
<%= link_to('註冊', new_registration_path(:user)) %> |
<%= link_to('登入', new_session_path(:user)) %>
<% end %>
Devise默认没有产生出first_name、last_name等等字段,我们可以加一些字段到User Model:
rails g migration add_username_to_users
,加上
add_column :users, :username, :string
rake db:migrate
新增这个字段编辑application_controller.rb补上configure_permitted_parameters方法:
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
# ...
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :username
devise_parameter_sanitizer.for(:account_update) << :username
end
end
编辑views/devise/registrations/edit.html.erb和views/devise/registrations/new.html.erb,加上username字段
<div><%= f.label :username %><br />
<%= f.text_field :username %></div>
除了使用上述的Devise自行处理使用者帐号密码之外,现在也非常流行直接使用外部的使用者认证系统,例如Google、Facebook、Yahoo、GitHub等等,一来绝大部分的使用者都已经有了这些大网站的帐号,不需要再注册一次。二来你也不需要担心储存密码的安全性问题。
这方面利用的套件是Omniauth,他可以搭配各种不同的Provider厂商:
如果你有多个网站需要实作SSO(single sign-on),可以考虑采用CAS的解决方案。推荐以下的Sinatra实作:
在让使用者登入之后,如果需要进一步设计使用者权限,除了自行实作之外,也有一些函式库可以帮助你设计,例如:
OAuth 是一个开放的标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,影片,联系人列表),而无需将用户名和密码提供给第三方应用。
进一步关于OAuth的介绍,推荐鸭七的OAuth 2.0 笔记