使用者认证

    使用者认证Authentication用以识别使用者身分,而授权Authorization则用来处理使用者有没有权限可以作哪些事情。

    是一套使用者认证(Authentication)套件,是Rails社群中最广为使用的一套。

    • 编辑 Gemfile 加上
    • 输入安装此套件
    • 输入rails g devise:install产生devise设定档
    1. config.action_mailer.default_url_options = { :host => 'localhost:3000' }
    • 确认 app/views/layouts/application.html.erb layout 中可以显示 flash 讯息,例如
    1. <p class="notice"><%= notice %></p>
    2. <p class="alert"><%= alert %></p>
    • 确认 routes.rb 中有设定网站首页位置,例如
    1. root :to => "welcome#index"
    • 输入rails g devise user产生 User model 及 Migration
    • 输入产生HTML样板,这会包括有注册、登入、忘记密码、Email等等页面,放在app/views/devise目录下。
    • 输入bin/rake db:migrate就会建立 users 资料表了
    • 可以在 Layout 中加上登入登出选单

    Devise默认没有产生出first_namelast_name等等字段,例如我们来加一个nickname字段到User Model

    • rails g migration add_nickname_to_users,加上
      add_column :users, :nickname, :string
    
    • 新增这个字段
    • 编辑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.permit(:sign_up, keys: [:nickname])
          devise_parameter_sanitizer.permit(:account_update, keys: [:nickname])
        end
      end
    
    • 编辑views/devise/registrations/edit.html.erbviews/devise/registrations/new.html.erb,加上username字段
      <div><%= f.label :nickname %><br />
      <%= f.text_field :nickname %></div>
    

    这里我们使用的套件是Omniauth,他可以搭配各种不同的Provider厂商:

    Devise 也可以和 Omniauth 整合在一起,请参考这份 Devise 的文件:

    在让使用者登入之后,如果需要进一步设计使用者权限,可以这么做:

    编辑 user.rb

    def admin?
      self.role == "admin"
    end
    

    在 application_controller.rb 中加上:

    protected
    
    def authenticate_admin
      unless current_user.admin?
        flash[:alert] = "Not allow!"
        redirect_to root_path
      end
    end
    

    接着在需要保护的 Controller 加上

    before_action :authenticate_user!  # 这个是 devise 提供的方法,先检查必须登入
    before_action :authenticate_admin # 再检查是否有权限
    

    除了自行实作之外,也有一些函式库可以帮助你设计,最知名的有两个 gem: