打造自己的用户验证系统

2017-11-10  本文已影响0人  bigbug_

我们知道rails已经有几个成熟的用户验证系统,如devise等,那么我们为什么要自己打造呢?

一 user model

执行命令
git checkout -b modeling-users
rails g model User name:string email:string
rails db:migrate
修改model app/model/user.rb
class User < ApplicationRecord
  validates :name, presence :true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence :true, length: { maximum: 255}, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }  
//(验证邮箱是否存在,长度,格式,唯一性,不区分大小写)
end
为email增加索引
rails g migration add_index_to_users_email
修改对应的migrate
  def change
    add_index :users, :email, unique: true
  end
rails db:migrate
修改model,最前面加上如下语句,其中右侧self省略了,而前面的不可以
  before_save { self.email = email.downcase }
 
A hashed password
在model中增加 has_secure_password ,然后增加password_digest列,增加了这个列has_secure_password才能启到作用。
rails g migration add_password_digest_to_users password_digest:string
修改对应migrate
  def change
    add_column :users, :password_digest, :string
  end
rails db:migrate
has_secure_password这个method使用bcrypt这个gem,所以加上它
  gem 'bcrypt',         '3.1.11'
bundle install
model中增加密码验证
  validates :password, presence: true, length: { minimum: 6 }

提交git,合并

git add -A
git commit -m "Make a basic User model (including secure passwords)"
git checkout master
git merge modeling-users
git push

二 Sign up

git checkout -b sign-up
修改config/routes.rb,增加
resources :users
增加页面,touch app/views/users/show.html.erb
<%= @user.name %>, <%= @user.email %>
app/controllers/users_controller.rb
def show
   @user = User.find(params[:id])
end
def new
  @user = User.new
end
def create
  @user = User.new(user_params)
  if @user.save
    flash[:success] = "Welcome to the Sample App!"
    redirect_to @user
  else
    render 'new'
  end
end
private
  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end
app/views/users/new.html.erb
<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user) do |f| %>
      <%= render 'shared/error_messages' %>
          <%= f.label :name %>
          <%= f.text_field :name, class: 'form-control' %>
          <%= f.label :email %>
          <%= f.email_field :email, class: 'form-control' %>
          <%= f.label :password %>
          <%= f.password_field :password, class: 'form-control' %>
          <%= f.label :password_confirmation, "Confirmation" %>
          <%= f.password_field :password_confirmation, class: 'form-control' %>
      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
错误信息提示
mkdir app/views/shared
touch app/views/shared/_error_messages.html.erb
<% if @user.errors.any? %>
  <div id="error_explanation">
    <div class="alert alert-danger">
      The form contains <%= pluralize(@user.errors.count, "error") %>.
    </div>
    <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>
app/assets/stylesheets/custom.scss
/* forms */

input, textarea, select, .uneditable-input {
  border: 1px solid #bbb;
  width: 100%;
  margin-bottom: 15px;
  @include box_sizing;
}

input {
  height: auto !important;
}
#error_explanation {
  color: red;
  ul {
    color: red;
    margin: 0 0 30px 0;
  }
}

.field_with_errors {
  @extend .has-error;
  .form-control {
    color: $state-danger-text;
  }
}

设置flash提醒

git add -A
git commit -m "Finish user signup"
git checkout master
git merge sign-up

SSL in production

basic login

rails generate controller Sessions new
Rails.application.routes.draw do
  root   'static_pages#home'
  get    '/help',    to: 'static_pages#help'
  get    '/about',   to: 'static_pages#about'
  get    '/contact', to: 'static_pages#contact'
  get    '/signup',  to: 'users#new'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  resources :users
end
上一篇下一篇

猜你喜欢

热点阅读