牛骨文教育服务平台(让学习变的简单)

Quality, Speed or Cheap. Pick two. - Unknown

使用者認證Authentication用以識別使用者身分,而授權Authorization則用來處理使用者有沒有權限可以作哪些事情。

Authentication: 使用 Devise

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 及 Migration

  • 如果需要E-mail驗證功能,可以編輯app/models/user.rbmigration將confirmable功能打開
  • 輸入rails generate devise:views產生樣板,這會包括有註冊、登入、忘記密碼、Email等等頁面,放在app/views/devise目錄下。
  • 輸入bin/rake db:migrate建立資料表

用法

  • 在需要登入的 controller 加上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>
    

Authentication: 使用 Omniauth

除了使用上述的Devise自行處理使用者帳號密碼之外,現在也非常流行直接使用外部的使用者認證系統,例如Google、Facebook、Yahoo、GitHub等等,一來絕大部分的使用者都已經有了這些大網站的帳號,不需要再註冊一次。二來你也不需要擔心儲存密碼的安全性問題。

這方面利用的套件是Omniauth,他可以搭配各種不同的Provider廠商:

Authentication: SSO

如果你有多個網站需要實作SSO(single sign-on),可以考慮採用CAS的解決方案。推薦以下的Sinatra實作:

Authorization

在讓使用者登入之後,如果需要進一步設計使用者權限,除了自行實作之外,也有一些函式庫可以幫助你設計,例如:

OAuth

OAuth 是一個開放的標準,允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,影片,聯繫人列表),而無需將用戶名和密碼提供給第三方應用。

進一步關於OAuth的介紹,推薦鴨七的OAuth 2.0 筆記